当前位置: 首页 > 知识库问答 >
问题:

将对象转换为字节数组引发NotSerializableException

韩经武
2023-03-14

下面的代码抛出java.io.NotSerializableException。为什么?谢谢!

private void test3() {
   Element3 element3=new Element3();
   ObjectToBytes3(element3);
}

private class Element3 implements Serializable{
  int code=0;
}

//-----------------------------------
private void ObjectToBytes3(Element3 elem){
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(bos);
        out.writeObject(elem);
        byte[] myBytes = bos.toByteArray();
    }
    catch (Exception e) {myPrint("exception",e.toString());}
    finally {
        try{
            out.flush();
            out.close();
            bos.close();
        }
        catch (Exception e) {}
    }
}
================================
class My implements Serializable{
    byte a=1;
    int b=88;
    String s="ggg";
    private My(byte a1, int b1,String s1) {
        a=a1;
        b=b1;
        s=s1;
    }
}

private void test() {
    My my=new My((byte)5,10,"jjj");
    ObjectToBytesTest(my);
}

//-----------------------------------
private void ObjectToBytesTest(My my){
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(bos);
        out.writeObject(element);
        byte[] myBytes = bos.toByteArray();
    }
    catch (Exception e) {print("exception",e.toString());}
    finally {
        try{
            out.flush();
            out.close();
            bos.close();
        }
        catch (Exception e) {}
    }
}

共有1个答案

拓拔坚
2023-03-14

这是因为Element3实例elem有一个对outter对象的隐式引用。

当序列化Element3使用Serializable接口的默认操作时,它会序列化outter对象,而outter对象没有实现Serializable接口,所以它会抛出java.io.NotSerializableException。

异常将引用未实现可序列化接口的outter对象的类。

要解决这个问题,您应该将Element3类移出outter类,如下所示:

    public class ObjectToBytesTest {
      private void ObjectToBytes3() { ... }
    }

    class Element3 implements Serializable {
        int code=0;
    }

或者就像您的解决方案一样(我的类实现了Serializable接口),但我认为不推荐使用这种解决方案。

 类似资料:
  • 问题内容: 如果我在运行时有一个Class实例,是否可以获取其byte []表示形式?我感兴趣的字节将为Class文件格式,这样它们将是[ClassLoader.defineClass] [3]的有效输入。 [3]:http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.S

  • 我有以下代码将csv文件创建为字节数组: 上面返回的是来自java包的字节[]。nio。文件 。 然而,现在我需要从api返回一个Json对象,而不是一个字节数组。 代码中的所有其他逻辑应该保持不变。我能做到这一点的最简单方法是什么?

  • 问题内容: 转换的最佳方法是什么: 至: 问题答案: ECMAScript 6引入了易于填充的内容: 该方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 数组的自身属性不会被复制,因为它无法枚举。 另外,您可以使用ES6 传播语法来达到相同的结果:

  • 问题内容: 48 30 我有一个X类型的对象,我想在将其发送到S3之前将其转换为字节数组。有人可以告诉我该怎么做吗?我感谢您的帮助。 问题答案: 你要执行的操作称为“ 序列化 ”。有几种方法可以做到,但是如果你不需要花哨的东西,我认为使用标准Java对象序列化就可以了。 也许你可以使用类似的东西? 可以对此进行一些改进。至少事实是每个字节数组只能读取/写入一个对象,这可能是你想要的,也可能不是。

  • 问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非

  • 问题内容: 转换的最佳方法是什么: 至: 问题答案: ECMAScript 6引入了易于填充的内容: 该方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 数组的自身属性不会被复制,因为它无法枚举。 另外,您可以使用ES6 传播语法来达到相同的结果: