`
刘小小尘
  • 浏览: 67485 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java list序列化

 
阅读更多

编图书馆的时候用了很多ArrayList,发现了反序列化后出现了如下问题:序列化前两个ArrayList中的某一元素指向同一对象,经过序列化再反序列化过程后,他们居然指向了不同对象,出现了不同步的问题,那是为什么呢?

查看一下Java.util里面的ArrayList源代码,发现ArrayList 重写了writeObject方法和readObject方法:

/**

* Save the state of the <tt>ArrayList</tt> instance to a stream (that

* is, serialize it).

*

*@serialDataThe length of the array backing the <tt>ArrayList</tt>

* instance is emitted (int), followed by all of its elements

* (each an <tt>Object</tt>) in the proper order.

*/

privatevoidwriteObject(java.io.ObjectOutputStream s)

throwsjava.io.IOException{

// Write out element count, and any hidden stuff

intexpectedModCount = modCount;

s.defaultWriteObject();

// Write out array length

s.writeInt(elementData.length);

// Write out all elements in the proper order.

for(inti=0; i<size; i++)

s.writeObject(elementData[i]);

if(modCount != expectedModCount) {

thrownewConcurrentModificationException();

}

}

/**

* Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,

* deserialize it).

*/

privatevoidreadObject(java.io.ObjectInputStream s)

throwsjava.io.IOException, ClassNotFoundException {

// Read in size, and any hidden stuff

s.defaultReadObject();

// Read in array length and allocate array

intarrayLength = s.readInt();

Object[] a = elementData =newObject[arrayLength];

// Read in all elements in the proper order.

for(inti=0; i<size; i++)

a[i] = s.readObject();

}

经过分析源代码以及实践证明:像Arraylist之类的引用序列化仍然是有效的,但是序列化之前ArrayList中指向同一对象的引用经过序列化和反序列化之后,这个关系将被破坏,即他们不再指向同一个对象,而是指向了两个不同的对象。原因在于序列化的时候是直接把Arraylist中每个元素指向的对象写到文件中,反序列化时再一一读出。这点值得大家在编程的时候注意。

分享到:
评论

相关推荐

    Java Json序列化与反序列化

    Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    JSON序列化反序列化带List

    本文将深入探讨如何在Delphi中进行JSON序列化与反序列化,特别是涉及List类型的数据。 首先,从2010年开始,Delphi引入了VCL库中的`System.JSON`单元,提供了`TJSON`类和相关的函数,使得处理JSON变得十分方便。在...

    Java中的序列化与反序列化.pdf

    Java序列化是Java平台提供的一种持久化机制,它允许我们将Java对象转换成字节流,以便于存储或者在网络中传输。这一过程被称为序列化,而将字节流还原成原来的对象则称为反序列化。在Java中,实现序列化主要通过实现...

    Java序列化多次追加到txt以及从txt反序列化

    Java序列化是Java平台提供的一种持久化对象的机制,它允许我们将对象的状态转换为字节流,以便存储或在网络上传输。在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖...

    java List 深度复制方法

    总结来说,Java中实现List的深度复制,可以采用序列化和反序列化的方法,或者手动复制每个元素。选择哪种方法取决于你的具体需求,例如对象是否支持序列化,以及性能和代码复杂性的考量。在处理可变对象时,确保深...

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

    ### C#对象序列化与反序列化 #### 1. 对象序列化的介绍 ##### (1).NET支持对象序列化的几种方式 .NET框架提供了多种序列化机制,它们各自有不同的应用场景和特点。 - **二进制序列化**: - **定义**:二进制...

    java序列化存储读取文件.doc

    根据提供的文件标题、描述以及部分代码内容,我们可以总结出该文档主要关注的是Java中的序列化技术,特别是如何利用序列化来存储和读取文件。接下来,我们将深入探讨这些知识点。 ### Java序列化简介 Java序列化是...

    时间序列算法java实现

    Java作为一种广泛使用的编程语言,提供了丰富的库和工具来实现时间序列算法。本篇文章将深入探讨时间序列预测的基本原理,Java实现的关键步骤,以及如何通过实际的代码示例进行实践。 时间序列数据是按特定时间顺序...

    java序列化

    Java序列化是一个重要的Java特性,它允许我们将Java对象转换为字节流,便于存储或在网络上传输。这一过程称为序列化,反向操作被称为反序列化。Java序列化的主要作用包括: 1. **持久化对象**:通过序列化,我们...

    利用java序列化实现基于文件的快速索引

    Java序列化是将对象的状态转换为字节流的过程,以便可以存储这些字节流或在网络上传输。在“利用java序列化实现基于文件的快速索引”这一主题中,我们将探讨如何利用Java的序列化机制来创建高效的数据索引,从而加速...

    使用XStream序列化/反序列化对象

    在Java编程中,序列化和反序列化是两个重要的概念,它们主要用于将对象的状态转换为可以存储或传输的形式,然后再恢复这些状态。XStream是一个强大的库,它允许开发者以XML格式进行序列化和反序列化Java对象。在这个...

    JAVA基于SnakeYAML实现解析与序列化YAML

    JAVA基于SnakeYAML实现解析与序列化YAML JAVA基于SnakeYAML实现解析与序列化YAML是JAVA开发中的一种常见需求,本文主要介绍了如何使用SnakeYAML库将YAML文档转换为Java对象,以及Java对象如何序列化为YAML文档。...

    缓存List并写入文件持久化.zip

    // 将List序列化到文件 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("cache.ser")); oos.writeObject(cache); oos.close(); System.out.println("Cache saved successfully."); }...

    json-lib 序列化和反序列化

    在`json-lib`中,序列化是指将Java对象转换成JSON字符串的过程,而反序列化则是将JSON字符串转换回Java对象。以下是对这两个过程的详细说明: 1. **序列化**: - 使用`json-lib`,你可以通过`...

    java的序列 map list set sequene

    总的来说,熟悉和掌握Map、List和Set接口以及序列化是Java编程的基础,它们在处理各种数据结构和业务场景时起着关键作用。深入学习并实践这些概念,将有助于提升你的编程技能和解决问题的能力。

    序列化,反序列化,接口

    在Java或C#等面向对象的语言中,序列化常用于将对象转换为字节流,以便存储在磁盘上或通过网络发送。序列化可以帮助我们保存应用程序的状态,使程序在下次启动时能够恢复到之前的状态。它也适用于分布式系统,如Web...

    python-javaobj:python-javaobj是一个python库,提供了读取Java对象序列化ObjectOutputStream的函数

    python-javaobj 是一个 python 库,它提供了读取和写入(写入当前是 WIP)Java 对象的函数,序列化或将被ObjectOutputStream反序列化。 这种对象表示形式是 Java 世界中的标准数据交换格式。 javaobj 模块公开了...

    Kryo序列化及反序列化用法示例

    Kryo是Java对象图形序列化框架,它主要特点是性能高效和易用,该项目用来序列化对象到文件、数据库或者网络。序列化是指将对象转换为字节流的过程,而反序列化是指将字节流转换回对象的过程。 Kryo序列化的优点包括...

    mobile练习序列化与反序列化

    iOS平台提供了多种序列化选项,包括NSKeyedArchiver和Property List(plist)。NSKeyedArchiver可以将对象编码为NSData,便于存储或在网络上传输。Plist则是一种XML或二进制格式,常用于存储配置或简单的数据结构。...

Global site tag (gtag.js) - Google Analytics