什么是对象序列化?

这个问题在这里已经有了答案:

  • Serializable是什么意思? 10个答案

  • 序列化是将一个对象转换为一系列字节,以便该对象可以轻松地保存到永久性存储器中或通过通信链接进行流式处理。 字节流然后可以被反序列化 - 转换成原始对象的副本。


    您可以将序列化看作将对象实例转换为字节序列(根据实现可能是二进制或非二进制)的过程。

    当您想要通过网络传输一个对象数据时,例如从一个JVM传输到另一个JVM,这非常有用。

    在Java中,序列化机制内置于平台中,但您需要实现Serializable接口以使对象可序列化。

    您还可以通过将属性标记为瞬态来防止对象中的某些数据被序列化。

    最后,你可以重写默认机制,并提供你自己的; 这可能适用于某些特殊情况。 为此,您可以使用java中的一个隐藏功能。

    重要的是要注意,被序列化的是对象或内容的“价值”,而不是类定义。 因此方法不会被序列化。

    这是一个非常基本的样本,附有评论以方便阅读:

    import java.io.*;
    import java.util.*;
    
    // This class implements "Serializable" to let the system know
    // it's ok to do it. You as programmer are aware of that.
    public class SerializationSample implements Serializable {
    
        // These attributes conform the "value" of the object.
    
        // These two will be serialized;
        private String aString = "The value of that string";
        private int    someInteger = 0;
    
        // But this won't since it is marked as transient.
        private transient List<File> unInterestingLongLongList;
    
        // Main method to test.
        public static void main( String [] args ) throws IOException  { 
    
            // Create a sample object, that contains the default values.
            SerializationSample instance = new SerializationSample();
    
            // The "ObjectOutputStream" class has the default 
            // definition to serialize an object.
            ObjectOutputStream oos = new ObjectOutputStream( 
                                   // By using "FileOutputStream" we will 
                                   // Write it to a File in the file system
                                   // It could have been a Socket to another 
                                   // machine, a database, an in memory array, etc.
                                   new FileOutputStream(new File("o.ser")));
    
            // do the magic  
            oos.writeObject( instance );
            // close the writing.
            oos.close();
        }
    }
    

    当我们运行这个程序时,会创建文件“o.ser”,我们可以看到后面发生了什么。

    如果我们将someInteger的值更改为(例如Integer.MAX_VALUE) ,我们可以比较输出以查看其差异。

    以下是截图,显示了这种差异:

    替代文字

    你能发现差异吗? ;)

    Java序列化中还有一个额外的相关字段:SerialversionUID,但我想这已经太长了以至于无法覆盖它。


    敢于回答6年前的问题,为刚接触Java的人添加了非常高层次的理解

    什么是序列化?

    将对象转换为字节和字节回到对象(反序列化)。

    什么时候使用序列化?

    当我们想要坚持对象。 当我们希望对象在JVM的生命周期之外存在时。

    真实世界示例:

    自动柜员机:当账户持有人试图通过自动取款机从服务器提取资金时,账户持有人信息(例如提款细节)将被序列化并发送到服务器,在那里详细信息被反序列化并用于执行操作。

    在java中如何执行序列化。

  • 实现java.io.Serializable接口(标记接口,因此没有方法实现)。

  • 坚持这个对象:使用java.io.ObjectOutputStream类,这是一个过滤流,它是低层字节流的包装(将Object写入文件系统或通过网络线传输扁平对象并在另一侧进行重建)。

  • writeObject(<<instance>>) - 写入一个对象
  • readObject() - 读取序列化的Object
  • 记得:

    在序列化对象时,只会保存对象的状态,而不是对象的类文件或方法。

    当您序列化2个字节的对象时,您会看到51个字节的序列化文件。

    步骤如何对象序列化和反序列化。

    回答:它是如何转换为51字节文件的?

  • 首先写入序列化流魔术数据(STREAM_MAGIC =“AC ED”和STREAM_VERSION = JVM的版本)。
  • 然后它写出与实例关联的类的元数据(类的长度,类的名称,serialVersionUID)。
  • 然后递归地写出超类的元数据直到找到java.lang.Object
  • 然后从与实例关联的实际数据开始。
  • 最后,将从元数据开始的与实例关联的对象的数据写入实际内容。
  • 如果您对更多关于Java序列化的部门信息感兴趣,请查看此链接。

    编辑 :一个更好的链接来阅读。

    这将回答几个常见的问题:

  • 如何不在课堂上序列化任何领域。
    Ans:使用瞬态关键字

  • 当子类被序列化父类被序列化?
    Ans:不,如果父母不扩展Serializable接口父母字段不会被序列化。

  • 当父节点被序列化时,子类是否被序列化?
    Ans:是的,默认情况下,子类也被序列化。

  • 如何避免子类被序列化?
    答案:a。 覆盖writeObject和readObject方法并抛出NotSerializableException

    湾 您也可以标记子类中的所有字段。

  • 某些系统级别的类(如Thread,OutputStream及其子类和Socket)不可序列化。
  • 链接地址: http://www.djcxy.com/p/29231.html

    上一篇: What is object serialization?

    下一篇: How do I save a stream to a file in C#?