`

序列化中的版本兼容问题

阅读更多


package tigers;

import java.io.*;


public class Tiger5 {
static class Inner implements Serializable {
private String name;
public Inner(String name) {
this.name = name;
}
public String toString() {
return "Tiger5$Inner:(" + name + ")";
}
//public void todo() {}
}
private static void writeObject(Inner in) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Tiger5$Inner.tmp"));
oos.writeObject(in);
}
private static Inner readObject() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Tiger5$Inner.tmp"));
return (Inner) ois.readObject();
}
public static void main(String[] args) {
Inner in = new Inner("inner");
try {
writeObject(in);
//in = readObject();
System.out.println(in);
} catch (Exception e) {
e.printStackTrace();
}
}
}

结果:

老版本的Inner对象被序列化到Tiger5$Inner.tmp文件中。

现在,在Inner中增加一个简单的非私有的todo()方法:

public void todo(){}

并修改main()方法如下,以便用新版本Inner类进行反序列化:

try {
//writeObject(in);
in = readObject();
System.out.println(in);
} catch (Exception e) {
e.printStackTrace();
}

结果:

java.io.InvalidClassException: tigers.Tiger5$Inner; local class incompatible: stream classdesc serialVersionUID = 925364839964073665, local class serialVersionUID = 2692111289122516972
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:519)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1546)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at tigers.Tiger5.readObject(Tiger5.java:34)
at tigers.Tiger5.main(Tiger5.java:40)

现在在Inner中加入版本控制字段:

private static final long serialVersionUID = 0;

然后按上面的步骤将老版本Inner对象序列化,并用新版本Inner对象读取,发现可以成功读取。

分享到:
评论

相关推荐

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

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

    redis使用过程中由于序列化工具引起的问题

    然而,在实际使用过程中,由于序列化工具的选择和配置不当,可能会引发一系列问题。这篇博客讨论的就是这类问题,特别是如何理解和解决由序列化工具导致的困扰。 在Redis中,当我们存储复杂的数据结构,如Java对象...

    delphi序列化与反序列化

    在实际开发中,确保序列化和反序列化的兼容性是至关重要的。当你的软件升级时,必须保证新版本能够正确地反序列化旧版本序列化的数据,反之亦然。这通常通过版本控制和数据格式标识来实现。 总结,Delphi中的序列化...

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

    而Java原生序列化虽然简洁,但可能导致版本问题,因为不同版本的类可能无法相互反序列化。 总结来说,使用Jedis操作Redis时,正确处理对象的序列化和反序列化是关键。结合Apache Commons库,我们可以方便地实现这一...

    java对象序列化和反序列化

    2. ** serialVersionUID**:为了保证序列化版本的兼容性,每个可序列化类应定义一个`serialVersionUID`字段。如果不显式定义,Java会自动生成一个,但当类结构改变时可能导致异常。 3. **ObjectInputValidation**:...

    序列化与反序列化Demo

    2. 版本问题:当类的结构发生变化时,序列化的对象可能无法正确地反序列化。为了解决这个问题,可以使用`serialVersionUID`字段。 3. 性能开销:序列化和反序列化过程可能会消耗一定的时间和内存资源。 此外,Java...

    序列化与反序列化经典例子

    1. **版本控制**:当你的类随着时间推移而演化,新增或删除字段时,需要考虑序列化兼容性。Java提供了`writeReplace()`和`readResolve()`方法处理版本问题。 2. **安全性**:反序列化可能成为攻击的入口点,因为...

    二进制序列化和XML序列化

    - 不兼容性:不同平台或版本间的二进制序列化可能存在兼容性问题,除非使用相同的运行环境和版本。 - 安全风险:未经适当保护的二进制序列化数据可能暴露敏感信息。 二、XML序列化 XML序列化则是将对象转换为符合...

    java序列化和反序列化

    - **版本兼容性:** 如果类结构发生变化,可能会导致序列化数据无法正确反序列化。 - **性能考虑:** 序列化和反序列化操作可能会对应用程序性能造成一定影响,特别是在大量数据处理时。 综上所述,Java序列化提供...

    Java序列化_Java序列化结构_

    这个版本号用于验证序列化过程中类的兼容性。如果类在序列化后进行了修改,`serialVersionUID`应该相应更新,否则反序列化可能会失败。如果没有显式定义,Java会自动生成一个基于类结构的默认值。 然而,Java序列化...

    java序列化实现演示

    Java序列化是Java平台中的一种标准机制,允许对象的状态被保存到磁盘或者在网络中进行传输,以便在后续的时间或地点...理解`serialVersionUID`的工作原理和其在保持序列化兼容性中的作用,是每个Java开发者必备的知识。

    Java对象序列化标准最新版

    版本管理的目标是在对象结构发生变更时保持序列化的兼容性。这有助于减少因对象变更而导致的问题。 **5.3 假设** 版本管理基于一些基本假设,例如对象的`serialVersionUID`应该随着类的变更而改变。 **5.4 谁负责...

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

    - **反序列化的使用总结**:反序列化时需要注意类型兼容性和安全性问题。 #### 6. 自定义序列化(仅适用于二进制与SOAP) ##### (1) 自定义序列化的实现方式 - 实现`ISerializable`接口:允许开发者控制序列化过程...

    C#关于treeview序列化的一个应用程序

    可以将整个TreeView控件直接序列化,但需要注意跨平台兼容性问题。 - JSON序列化:使用Newtonsoft.Json库,将TreeView数据转换成JSON字符串,便于在网络上传输或存储。 5. **代码示例**: ```csharp using ...

    Json序列化与反序列化

    5. **错误处理**:在序列化和反序列化过程中,可能出现格式错误、类型不匹配等问题,需要捕获并处理这些异常。 总结来说,JSON序列化与反序列化是现代Web开发中不可或缺的一部分,它提供了数据交换的标准格式,使得...

    c#对象序列化与反序列化实例

    - 使用`BinaryFormatter`时,序列化的对象必须在同一环境中反序列化,因为它的序列化结果包含类型元数据,这可能在不同版本或不同计算机之间引起问题。 - JSON和XML序列化则更加平台和语言独立,但它们的序列化结果...

    对象的序列化和反序列化

    为了解决这个问题,Java提供了`serialVersionUID`字段,这是一个用于验证序列化兼容性的版本标识。默认情况下,JVM会自动生成这个ID,但开发者也可以手动指定。如果类的`serialVersionUID`与序列化时的版本不匹配,...

    IDEA中实体类实现了序列化接口

    ### IDEA中实体类实现序列化接口与...序列化ID对于确保序列化和反序列化的兼容性非常重要,正确地处理序列化ID可以帮助避免很多潜在的问题。希望本篇文章能帮助开发者们更好地理解和解决序列化过程中可能遇到的问题。

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

    另外,如果类结构发生变化,反序列化可能会失败,因此在设计和维护系统时,需要考虑序列化兼容性问题。 在实际开发中,根据需求的不同,我们还可以选择其他类型的序列化,如XML序列化、JSON序列化等,它们在数据...

    序列化与反序列化示例

    此外,由于.NET框架版本的差异,二进制序列化的结果可能在不同版本之间不兼容。 总结来说,.NET框架提供了多种序列化和反序列化方法,包括XML和二进制。在选择合适的序列化方式时,需要考虑数据的可读性、兼容性、...

Global site tag (gtag.js) - Google Analytics