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的序列化 为什么实现了 ...
随机推荐
- Extra Judicial Operation
Description The Suitably Protected Programming Contest (SPPC) is a multi-site contest in which conte ...
- python类中两个列表实例如何相加或相减
如下 import numpy a = [1, 2, 3, 4] b = [5, 6, 7, 8] a_array = numpy.array(a) b_array = numpy.array(b) ...
- 【Android开发日记】之入门篇(十)——Android应用配置文件解析
在Android基于组件的应用设计架构中,配置文件是一个很重要的元素.它将应用所包含的组件.各组件的能力和配置以及应用环境介绍给Android框架层的各个服务,让Android知道如何去调度应用中的各 ...
- JS打印——第三方控件打印
LODOP 官方地址:http://www.lodop.net/ 一个很好的打印控件,可以是实现纸张设置.横打竖打.打印预览.打印维护多种功能.官网的示例非常详细.能很好支持多种浏览器的打印. 在使用 ...
- js5秒后自动关闭本页面及5秒钟后自动跳转指定页面的方法
5秒钟后自动关闭 <!DOCTYPE HTML> <html> <head> <title>倒计时自动关闭/跳转页面</title> < ...
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
来自:http://blog.163.com/zhangzhifeng688%40126/blog/static/1652627582010102261748481/ 给结构体指针分配内存 但在很多 ...
- 在Ubuntu/Centos使用 Let's Encrypt 证书部署 HTTPS的方法
certbot地址 apache服务器(ubuntu环境): 1.获取软件包: $ sudo apt-get update $ sudo apt-get install software-proper ...
- Mysql数据库乱码总结
今天又独到了Mysql乱码问题,过去总是匆匆的解决了就算了.这次我实在受不了了.每次都是迷迷糊糊的改好的. 这次决定好好探索一把,看了很多资料及博客之后才理解了点.先记录下来.如有不对的请指正. 1. ...
- django rest framework如何实现nest field显示,如何保存有外键的字段更新
一步一步深入了. 相关设置技巧如下: 直接nest field显示: class VersionPoolSerializer(serializers.ModelSerializer): site_na ...
- (7)java基础知识-原码、反码、补码、运算符
一.原码.反码.补码 原码 一个数转化成二进制. 用最高位来表示正负,最高位为0表示正数,最高位为1表示负数. 例如: short i=5: 因为在java里short占2个字节转化成二进制就是 00 ...