首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象转换为字节数组引发NotSerializableException

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

Stack Overflow用户
提问于 2013-11-27 05:45:27
回答 1查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
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) {}
    }
}

输出和堆栈如下: 2674,25 ObjToBytes: 2674,32例外: java.io.NotSerializableException: java.util.concurrent.ThreadPoolExecutor stack= java.io.NotSerializableException: java.util.concurrent.ThreadPoolExecutor at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0( java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) )

很有趣,但下面的代码工作正常

代码语言:javascript
复制
================================
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) {}
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-27 06:04:07

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

当序列化Element3使用可序列化接口的默认操作时,它将序列化outter对象,而outter对象尚未实现可序列化接口,因此它将抛出java.io.NotSerializableException。

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

在我的代码中,它是:java.io.NotSerializableException: serializable.ObjectToBytesTest

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

代码语言:javascript
复制
    public class ObjectToBytesTest {
      private void ObjectToBytes3() { ... }
    }

    class Element3 implements Serializable {
        int code=0;
    }

或者就像您的解决方案一样(我的类实现了可序列化接口),但是我认为这个解决方案是不推荐的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20234799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档