0
package example;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.Object;

class Utils {
    public static Object copy(Object oldObj) {
        Object obj = null;
        try {
            // Write the object out to a byte array
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            out.writeObject(oldObj);
            out.flush();
            out.close();

            // Retrieve an input stream from the byte array and read
            // a copy of the object back in.
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream in = new ObjectInputStream(bis);
            obj = in.readObject();
        } catch (IOException e) {
            e.printStackTrace();   
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        }
        return obj;
    }
}

public class mytest {
    public static void main(String[] args) throws IOException {
        Object clonedObject = Utils.copy(new Object());
        clonedObject.notifyAll();
    }
}

上面的代码是通过将对象更改为字节数组来展示深拷贝的工作原理。但是 myeclipse 给出了以下错误消息,我不知道为什么。

java.io.NotSerializableException: java.lang.Object
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
    at example.Utils.copy(mytest.java:17)
    at example.mytest.main(mytest.java:37)
Exception in thread "main" java.lang.NullPointerException
    at example.mytest.main(mytest.java:38)

能否请你帮忙?谢谢!

4

7 回答 7

1

你的对象应该实现Serializable接口

提示:为了克隆对象,最好实现Cloneable接口和使用object.clone()方法

于 2013-08-13T09:35:06.413 回答
1

这意味着它java.lang.Object不可序列化,它不实现Serializable,可能您正在将类的对象传递Object给您的方法。

于 2013-08-13T09:35:14.050 回答
1

您正在尝试序列化 not Serializable(即,它没有实现接口Serializable)对象

试试这个 :

Object clonedObject = Utils.copy(new String("Hello");

String类是Serializable

于 2013-08-13T09:36:54.797 回答
1

当您执行 writeObject 时,您编写的 objevt 需要是可序列化的。尝试将您的copy-method 的签名更改为

public static Object copy(Serializable oldObj)

错误信息会更清楚。

于 2013-08-13T09:38:23.003 回答
0

该类Object没有实现Serializable接口,因此不能直接与对象流一起使用。更多细节在这里

于 2013-08-13T09:38:04.990 回答
0

从以下文档ObjectOutputStream.writeObject

抛出:

NotSerializableException - 某些要序列化的对象未实现 java.io.Serializable 接口。

这是有道理的,因为您使用参数调用您的方法new Object()。确实,Object没有实现Serializable。但是,我想知道为什么签名writeObject不简单

writeObject(Serializable object)

这将防止这种错误。

于 2013-08-13T09:39:29.120 回答
0

这是说您的对象不符合序列化过程的条件,因为它没有实现Serilizable接口。
根据java文档

java.io.NotSerializableException当实例需要具有 Serializable 接口时抛出。序列化运行时或实例的类可以抛出此异常。

于 2013-08-13T09:41:29.187 回答