`

序列化(二): 为什么要序列化?

阅读更多



在readResolve()方法与序列化中, 由readResolve方法想到了序列化, 那为什么要序列化呢? 应该说很久没考虑过类似这样Java底层一点的问题了. 在本篇中, 笔者试着总结归纳下现在我能想到的原因,如有不周或不全的地方请大家多多指正.

为什么要序列化?或者说序列化能带来什么好处? 大致想来有如下几个原因:
1, 支持RMI. 我们知道利用RMI机制可以跨JVM地服务互访,而服务互访肯定是要通信的,也就是说要传递数据的, 对象的序列化这时就提供了数据传送前后的拆装和组装机制.这方面的知道只是理解,工作中也没有真正用过,更进一步说,现在RMI用的很少很少,貌似也没必 要花精力为研究这一块的东西了. Google时,发现一篇文章,记在这里Introduction to Java RMI .
2, 一种对象克隆方式. 利用序列化,我们可以先把某个对象序列化对内存,再反序列化地从内存读出,这样就达到一种变相克隆的效果. 这时的一个注意, 确保要克隆对象里属性及属性的属性都是实现了Serializable接口的, 不然会报NotSerializableException. 下面是可支持泛型的代码:

public static <T> List<T> serializableCloneToArray(T dc, int count) throws Exception {
        List<T> results = new ArrayList<T>();
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream os = new ObjectOutputStream(bo);
        
        os.writeObject(dc);
        
        ByteArrayInputStream bi = null;
        ObjectInputStream oi = null;
        for (int i = 0; i < count; i++) {            
            bi = new ByteArrayInputStream(bo.toByteArray());
            oi = new ObjectInputStream(bi);
            results.add((T) oi.readObject());
        }
        return results;
 }
3, 一种持久化方式. 应该说这个用的更少, 简单来说就是把一些类信息序列化地持久到一个文件中, 再在以后的某个时候从文件中反序列化地读出. 实现方式跟上面的"对象克隆"类似, 只不过是把ByteArrayOutputStream/ByteArrayInputStream分别替换为 FileOutputStream/FileInputStream.

4, 跟GUI的JavaBeans相关. 看Thinking In Java时, 发现这么一段话: Object serialization was added to the language to support two major features: RMI, .....Object serialization is also necessary for JavaBeans, described in the Graphical User Interfaces chapter. When a Bean is used, its state information is generally configured at design time. This state information must be stored and later recovered when the program is started; object serialization performs this task.这里面关于JavaBeans跟序列化有什么关系? 现在还不理解,也没有体会.

除了上面这三个用处/好处外, 还有什么别的? 请大家指正.

4
1
分享到:
评论

相关推荐

    Json序列化反序列化工具:JsonToolsJson序列化反序列化工具:JsonTools Json序列化反序列化工具:JsonTools

    JsonTools是一个不错的JSON序列化和反序列化功能包

    C++ JSON 序列化与反序列化

    3. 序列化: ```cpp json j = p; // 自动转换为json对象 std::string jsonString = j.dump(); // 将json对象转换为字符串 ``` **二、JSON反序列化** 反序列化是将JSON字符串恢复为C++对象的过程。继续以nlohmann/...

    二进制序列化和XML序列化

    例如,要序列化一个名为`Person`的对象,可以这样做: ```csharp [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } // 二进制序列化 using (var stream ...

    四种反序列化与序列化

    - **BinaryFormatter序列化**:C#的 `System.Runtime.Serialization.Formatters.Binary.BinaryFormatter` 类提供了二进制序列化功能,它将对象转换为效率高的二进制表示,适合本地存储和高效数据传输。然而,由于...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    C#中二进制数组转换,二进制序列化和json序列化方法

    要将一个整型数组(int[])转换为二进制数组,你可以使用BitConverter类,它提供了将基本类型转换为字节序列的方法。例如: ```csharp int[] intArray = new int[] { 1, 2, 3 }; byte[] byteArray = new byte...

    C#和Java的序列化反序列化

    首先,我们要了解什么是序列化。序列化是指将对象的状态转化为可存储或可传输的数据格式的过程。这个过程通常将内存中的对象转换成字节流,以便保存到磁盘、数据库或者通过网络进行传输。在C#中,我们可以使用.NET...

    《C#序列化和反序列化之一-二进制序列化》源代码

    二进制序列化是.NET框架提供的一种机制,它可以将对象转换为原始字节流,以便保存在磁盘上或通过网络传输。C#中的`System.Runtime.Serialization.Formatters.Binary`命名空间提供了实现二进制序列化所需的类。主要...

    java serializable 序列化与反序列化

    1. **什么是反序列化**:反序列化是将序列化的字节流恢复为原来的对象状态的过程。 2. **如何实现反序列化**:使用`ObjectInputStream`的`readObject()`方法从流中读取对象: ```java try (ObjectInputStream ois...

    基于boost的序列化与反序列化

    例如,对于一个名为`MyClass`的类,你可以这样定义序列化: ```cpp class MyClass { // 成员变量... friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int ...

    hessian学习基础篇——序列化和反序列化

    首先,让我们理解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续...

    Jedis序列化和反序列化使用jar

    1. 实现序列化:创建一个实现了`Serializable`接口的对象,然后使用`SerializationUtils.serialize(obj)`(来自Commons Lang)将其序列化为字节数组。 2. 存储序列化后的对象:使用Jedis的`set(key, bytes)`方法将...

    XML序列化与反序列化 实战

    XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...

    序列化和反序列化的封装类

    序列化是将一个对象的状态转换为可以存储或传输的形式,通常是XML、JSON或二进制格式。这样做的好处在于,我们可以保存对象的状态并在稍后恢复,或者将对象发送到远程服务器。在C#中,我们可以使用ISerializable接口...

    java序列化和反序列化

    下面通过一个简单的示例来说明如何实现序列化和反序列化: ```java import java.io.Serializable; class MyClass implements Serializable { private String s; private int i; private double d; public ...

    msgpack工具库二进制格式序列化反序列化

    - 自定义类型序列化:通过实现`MessagePack.PackerFactory`和`MessagePack.UnpackerFactory`接口,可以自定义特定类型的序列化和反序列化逻辑。 - 类型安全:MsgPack提供了一种方式来确保反序列化的对象类型与原始...

    java序列化和反序列化的方法

    Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...

    学生管理系统(序列化和反序列化)

    序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储或传输的形式,然后在需要时还原为原来的对象。以下是对这两个概念的详细解释以及在学生管理系统中的应用。 1. **序列化**:序列化是...

    C#对象序列化与反序列化

    由于篇幅限制,这里不再给出具体的代码示例,但可以参考二进制序列化的示例,将`BinaryFormatter`替换为`SoapFormatter`,并相应地调整命名空间和方法调用。 #### 4. 使用XML方式序列化和反序列化 ##### (1) XML...

Global site tag (gtag.js) - Google Analytics