`
刘小小尘
  • 浏览: 62750 次
  • 性别: 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对象序列化保存为XML文件的工具类

    在java.beans包中,有两个好东西,XMLEncoder和XMLDecoder。从XML存取对象真是太费力气啦。做了小工具类,以后可以用用了。本文介绍了这两个可以把JAVA对象序列化保存为XML文件的工具类。

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

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

    Java中GSON的使用(源代码)

    1.3 数组和List的序列化/反序列化 1.3.1 数组的序列化/反序列化 1.3.2 List集合的序列化/反序列化 1.4 Set和Map的序列化/反序列化 1.4.1 Set集合的序列化/反序列化 1.4.2 Map集合的序列化/反序列化 1.5 Map的value为...

    又小又快又无依赖Json序列化与反序列化

    又小又快又无依赖Json序列化与反序列化 eg: 1.json序列化 String json=JsonUtil.instance().obj2Json(obj); 2.json反序列化(Object表示具体的类) Object obj=JsonUtil.instance().json2Obj(json,Object.class) ...

    轻量级JSON解析库Brief-JSON.zip

    JSONSerializer.deserializer :将JSON文本解析为List和MapBeanSerializer.serializer :把Java Bean序列化为List和MapSeriable :把Java Bean中要序列化的字段用此注解。无此注解的字段将不序列化;ParseException :...

    dubbo-exp:Dubbo反序列化一键快速攻击测试工具,支持dubbo协议和http协议,支持hessian反序列化和java原生反序列化

    a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...

    Android中的序列化浅析

    在Android系统中关于序列化的方法一般有两种,分别是实现Serializable接口和Parcelable接口,其中Serializable接口是来自Java中的序列化接口,而Parcelable是Android自带的序列化接口。 上述的两种序列化接口都有各自...

    DSON-Java:总督序列化对象表示法(http

    Doge序列化对象表示法( )的完整,零依赖Java实现。 支持序列化和解析。 正确地将所有数字从和转换为八进制。 一些代码使用名称,以使Shiba Inu狗更容易理解该代码。 用法 public static class DogeExample { ...

    JAVA核心知识点整理.zip

    java核心知识点整理,面试很有用 Java核心知识点2.JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个...5.6JAVA 序列化(创建可复用的 Java 对象) 5.7JAVA 复制 6. Spring 原理

    struts2_json

    所谓正反序列化json数据就是后台把Java对象序列化成json格式字符串及前台把json格式字符串传到后台序列化成对应的Java对象,最重要的是这个例子有简单和复杂(List对象)的正反序列化的例子,里面虽然有纯ajax请求...

    List转化为json的jar包

    本人使用过,可以的。是List转化成json时的jar包。欢迎下载使用。

    腾讯java面试题合集

    支持基于Kryo和FST的Java高效序列化实现; 支持基于Jackson的JSON序列化; 支持基于嵌入式Tomcat的HTTP remoting体系; 升级Spring至3.x; 升级ZooKeeper客户端; 支持完全基于Java代码的Dubbo配置;  Java List...

    Redis部署笔记(单机+主从+哨兵+集群)

    基于Centos7系统,由浅入深讲解如何部署Redis的四种模式,分别是:单机模式、主从模式、哨兵模式、集群模式。...● 把Redis的List封装成RedisList类,暴露API模仿Java的List ● 把Redis的单键值对封装成RedisObj类

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Java开发技术大全(500个源代码).

    Student.java 定义一个用来序列化的类 ThreadIn.java 接收数据用的线程类 ThreadOut.java 发送数据用的线程类 TypeFile.java 显示文件内容的类 useScanner.java 用Scanner接收用户的输入 第8章 示例描述:本章...

    java解决大批量数据导出Excel产生内存溢出的方案

    java解决大批量数据导出Excel产生内存溢出的方案

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    JAVA基础课程讲义

    JAVA对象的序列化和反序列化 161 为什么需要序列化和反序列化 161 对象的序列化主要有两种用途 161 序列化涉及的类和接口 162 序列化/反序列化的步骤和实例 162 综合的序列化和反序列化练习 163 JAVA.IO包相关流对象...

Global site tag (gtag.js) - Google Analytics