Java List序列化的实现
概述
java中的序列化与反序列化都要求对象实现Serializable
接口(其实就是声明一下),而对于List这种动态改变的集合默认是不实现这个接口的,也就是不能直接序列化。但是数组是可以序列化的,所以我们只需要将List集合与数组进行转换就可以实现序列化与反序列化了。
序列化
Object对象
public class TestObject implements Serializable{
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
实例化对象,加点数据,然后执行序列化
public class Test {
public static void main(String[] args)
{
//创建要序列化的集合对象
List<TestObject> list = new ArrayList<>();
//加数据
for (int i = 0; i < 5; i++)
{
TestObject testObject = new TestObject();
testObject.setName("MJJ-"+i);
testObject.setAddress("HangZhou");
list.add(testObject);
}
File file = new File("object.adt");
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)))
{
//将List转换成数组
TestObject[] obj = new TestObject[list.size()];
list.toArray(obj);
//执行序列化存储
out.writeObject(obj);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
反序列化
public class Test {
public static void main(String[] args)
{
File file = new File("object.adt");
try (ObjectInputStream out = new ObjectInputStream(new FileInputStream(file)))
{
//执行反序列化读取
TestObject[] obj = (TestObject[]) out.readObject();
//将数组转换成List
List<TestObject> listObject = Arrays.asList(obj);
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
封装
利用泛型把序列化和反序列化的方法封装起来,方便使用。
工具类
public class StreamUtils {
/**
* 序列化,List
*/
public static <T> boolean writeObject(List<T> list,File file)
{
T[] array = (T[]) list.toArray();
try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)))
{
out.writeObject(array);
out.flush();
return true;
}
catch (IOException e)
{
e.printStackTrace();
return false;
}
}
/**
* 反序列化,List
*/
public static <E> List<E> readObjectForList(File file)
{
E[] object;
try(ObjectInputStream out = new ObjectInputStream(new FileInputStream(file)))
{
object = (E[]) out.readObject();
return Arrays.asList(object);
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return null;
}
}
使用工具类
//序列化
StreamUtils.<TestObject>writeObject(list, new File("object.adt"));
//反序列化
List<TestObject> re = StreamOfByte.<TestObject>readObjectForList(new File("object.txt"));
Java List序列化的实现的更多相关文章
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- JAVA的序列化和持久化的区别与联系
持久化(Persistence) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文 ...
- 理解Java对象序列化
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...
- java 对象序列化与反序列化
Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为 ...
- Java的序列化ID的作用
Java的序列化ID的作用 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersio ...
- Java基础-序列化
Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法: 为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判 ...
- java 对象序列化
java 对象序列化 package org.rui.io.serializable; import java.io.ByteArrayInputStream; import java.io.Byte ...
- 理解Java对象序列化(二)
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- 深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了 ...
随机推荐
- HDU3068 最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- lca板子
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using ...
- 自定义View Measure过程(2)
目录 目录 1. 作用 测量View的宽/高 在某些情况下,需要多次测量(measure)才能确定View最终的宽/高: 在这种情况下measure过程后得到的宽/高可能是不准确的: 建议在layou ...
- 【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)
原文转自 http://blog.csdn.net/qq_23536063/article/details/52291332 [问题描述] CString cstr: sring str(cstr.G ...
- C++编程见闻
今天心血来潮,看到很多天借的一本书<轻松学C++编程>,书就一般,但是由于自己的刚开始学c++,勉强凑活来看吧,就把学习的过程亮出来,权且对自己的一种变相激励也好. 程序一 首先:打开vi ...
- (二十四)linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
- Bash 文件夹操作
mkdir, rm,find都是对tree结构的文件夹进行的操作,可以安装tree用tree命令直接打印出树的结构 文件夹的操作分为只操作当前文件夹的集合数据和迭代操作的tree数据 Bash迭代当前 ...
- 【原创】DQS安装失败——系统重新引导是否处于挂起状态
问题: 安装完SQL Server 2012后,准备安装DQS服务,但是总是提示:操作“检查系统重新引导是否处于挂起状态”已完成,但有错误,正在中止安装.非常无奈,因为都根据其要求重启 ...
- ORA-01940: cannot drop a user that is currently connected
https://www.cnblogs.com/lwlxqlccc/p/8694696.html
- hdu3507(初识斜率优化DP)
hdu3507 题意 给出 N 个数字,输出的时候可以选择连续的输出,每连续输出一串,它的费用是 这串数字和的平方加上一个常数 M. 分析 斜率优化dp,入门题. 参考 参考 得到 dp 方程后,发现 ...