下面的代码抛出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) {}
}
}输出和堆栈如下: 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) )
很有趣,但下面的代码工作正常
================================
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) {}
}
}发布于 2013-11-27 06:04:07
这是因为Element3实例elem有一个对outter对象的隐式引用。
当序列化Element3使用可序列化接口的默认操作时,它将序列化outter对象,而outter对象尚未实现可序列化接口,因此它将抛出java.io.NotSerializableException。
异常将引用未实现可序列化接口的outter对象类。
在我的代码中,它是:java.io.NotSerializableException: serializable.ObjectToBytesTest
要解决这个问题,您应该将Element3类移出outter类,如下所示:
public class ObjectToBytesTest {
private void ObjectToBytes3() { ... }
}
class Element3 implements Serializable {
int code=0;
}或者就像您的解决方案一样(我的类实现了可序列化接口),但是我认为这个解决方案是不推荐的。
https://stackoverflow.com/questions/20234799
复制相似问题