首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java序列化的内部:哪个类启动序列化过程?

java序列化的内部:哪个类启动序列化过程?
EN

Stack Overflow用户
提问于 2015-12-13 16:16:16
回答 2查看 373关注 0票数 0

如果我想序列化一个java对象,我只需要实现标记接口Serializable,它没有任何方法。

代码语言:javascript
运行
复制
class Employee implements Serializable{
    private int id;
    private String name;

    /*
    private void writeObject(ObjectOutputStream out) throws IOException{
        System.out.println("in write object");
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
        System.out.println("in read object");
    }
    */

}

我的查询(编辑):

  1. 通过在代码中实现标记接口Serializable,Java正在序列化my对象。哪个类负责实现Serializable接口的java对象的序列化? 这个过程的切入点是什么?谁给ObjectOutputStream打电话?
  2. 即使没有实现Externalizable接口,也会调用我类的私有方法:readObjectwriteObject。在上面的代码中已经对它们进行了注释,以启用默认的Java序列化。为什么在不显式实现Externalizable接口的情况下允许使用它?

编辑:为了明确我的问题,为什么Java允许私有readObject & writeObject方法而不是强制使用Externalizable实现来定制序列化过程。

来自Java文档:

可扩展接口的writeExternal和readExternal方法由类实现,以使类完全控制对象及其超级类型的流的格式和内容。这些方法必须显式地与父类型协调以保存其状态。这些方法取代了writeObject和readObject方法的自定义实现。

两种机制都不能实现相同的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-13 19:28:41

哪个类启动序列化过程?

java.io.ObjectOutputStream.

  1. 通过在代码中实现标记接口Serializable,Java正在序列化my对象。哪个类负责实现Serializable接口的java对象的序列化?

java.io.ObjectOutputStream,又来了。你好像在找不存在的神奇的东西。

  1. 即使没有实现Externalizable接口,也会调用我类的私有方法:readObjectwriteObject。在上面的代码中已经对它们进行了注释,以启用默认的Java序列化。为什么在不显式实现Externalizable接口的情况下允许使用它?

您命名的方法与Externalizable接口无关,后者包含两个完全不同的方法。您的问题的答案很简单,就是这样设计的,以便允许某种程度的自定义序列化,而不需要Externalizable接口,并且它是通过反射实现的。

为什么Java允许私有readObject & writeObject方法而不是强迫使用Externalizable实现来定制序列化过程。

它们是不相等的,所以这个问题没有意义。在Serializable级别,Java提供了自动处理本地和父级非瞬态状态的功能,而在Externalizable中,您必须完全自己处理。

这两种机制不是取得了相同的结果吗?

不是的。

票数 1
EN

Stack Overflow用户

发布于 2015-12-13 16:39:41

负责序列化对象的类是java.io.ObjectOutputStream。反序列化是在java.io.ObjectInputStream类中完成的。

类JavaDoc ObjectOutputStream也包含以下内容:

在序列化和反序列化过程中需要特殊处理的类必须实现具有以下确切签名的特殊方法: 私有空readObject(java.io.ObjectInputStream流)抛出IOException,ClassNotFoundException;私有虚writeObject(java.io.ObjectOutputStream流)抛IOException;私有空readObjectNoData()抛出ObjectStreamException;

下面是一些伪代码,它展示了ObjectOutputStream的工作原理。我省略了许多细节,部分工作是用ObjectStreamClass完成的。

代码语言:javascript
运行
复制
class ObjectOutputStream {

    writeObject(obj) {
        writeObject0(obj);  
    }

    writeObject0(obj) {
        if (hasWriteReplaceMethod(obj)) {
            obj = obj.writeReplace();
        }
        writeOrdinaryObject(obj);
    }

    writeOrdinaryObject(obj) {
        if (isExternalizable(obj)) {
            writeExternalData(obj);
        } else {
            writeSerialdata(obj);
        }
    }

    writeExternalData(obj) {
        obj.writeExternal(this);
    }

    writeSerialData(obj) {
        if hasWriteObjectMethod(obj)
            obj.writeObject(this);
        else
            defaultWriteFields(obj);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34253236

复制
相关文章

相似问题

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