Java之序列化
来源:互联网 发布:石家庄网络机柜 v 编辑:程序博客网 时间:2024/04/29 13:39
内置serialize序列化
创建一个自定义类:
class VarClass1 implements Serializable { boolean aBoolean; char aChar; byte aByte; short aShort; int anInt; long aLong; float aFloat; double aDouble; String aString; transient boolean tBoolean; transient char tChar; transient byte tByte; transient short tShort; transient int tnInt; transient long tLong; transient float tFloat; transient double tDouble; transient String tString;}
序列化到文件:
VarClass1 vc1 = new VarClass1();// 设置属性值ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serialize.bin"));oos.writeObject(vc1);oos.flush();oos.close();
序列化后,类中所有的不被transient关键字修饰的属性都会以二进制形式存储在文件中。
从文件中读取(反序列化):
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serialize.bin"));VarClass1 vc1 = (VarClass1) ois.readObject(); // 强制转换ois.close();
从文件中读取类时,除了可能会抛出常见的IOException外,还可能会抛出以下异常:
- java.io.EOFException:文件为空,或者在文件末尾使用read操作
- java.io.StreamCorruptedException:文件内容不能被反序列化
- java.io.InvalidClassException:文件中的类和程序中的类,属性定义不一样
第三方Json序列化
找一个第三方的Json库,我用的是Google的Gson(开源在Github),将jar包添加到工程。
定义一个类。代码和前面的差不多,只是不需要实现Serializable接口。
序列化到文件:
VarClass1 vc1 = new VarClass1();// 设置属性值JsonWriter jw = new JsonWriter(new FileWriter("json.json"));(new Gson()).toJson(vc1, vc1.getClass(), jw);jw.flush();jw.close();
序列化后,类中所有的不被transient关键字修饰的属性都会以json数据类型形式存储在文件中。默认无缩进。
缩进后:
从文件中读取(反序列化):
JsonReader jr = new JsonReader(new FileReader("json.json"));VarClass1 vc1 = (new Gson()).fromJson(jr, VarClass1.class); // 不需要强制转换jr.close();
使用Gson反序列化时,需要注意以下几点:
- 出现Json文件语法出错等问题,程序会报com.google.gson.JsonSyntaxException
- 如果文件为空,或者说JsonReader流为空的话,那么Gson获取到的对象为null,而不是报异常
- 文件中的类和程序中的类,属性定义不一样(比如transient关键字不一致、不存在的属性、属性缺失等),那么Gson读取文件到类时会跳过错误(忽略transient、忽略不存在的属性、不存在的属性取默认值0&0.0&null等),而不会报异常
后记
- 内置的序列化只要出了点问题就会报异常,而Google的Gson则是尽量忽略问题。哪个更为符合自己的习惯,哪个更适合实际场景,就用哪个吧。至于优劣只能见仁见智了。
- 但是Json序列化之后的内容,可读性还是要大大优于内置序列化之后的内容,也更容易修改,毕竟后者是用二进制的。
0 0
- Java之序列化
- Java之序列化
- java之序列化
- java之序列化
- Java之序列化
- java之序列化
- Java之序列化
- JAVA之序列化
- Java序列化之自定义序列化
- java序列化之比较
- Java之序列化小记
- java序列化之serialVersionUID
- Java学习之序列化
- Netty之java序列化
- Java回顾之序列化
- java基础之序列化
- Java 进阶 之 序列化
- Java序列化之开篇
- C语言实验——各位数字之和排序
- Charles 使用中入过的坑
- SourceTree冲突解决详解
- 关于J2EE中Servlet
- RPM打包原理、示例、详解及备查
- Java之序列化
- ns-2与TCP拥塞模拟 之五 ns-2中添加核心模块-TCPAgent子类
- PSR-4
- 短信的发送流程
- ns-2与TCP拥塞模拟 TCP拥塞控制核心模块-变量说明
- 郝斌的C语言基础 120 局部变量和全局变量
- 数日子
- java最基本概念小结
- ls 命令详解