Java 对象序列化
2015-05-16 00:00
260 查看
摘要: 深入理解Java对象序列化
先上代码
然后是需要序列化Person对象
从上述代码可知,如果被写对象的类型是String,或数组,或Enum,或Serializable,那么就可以对该对象进行序列化,否则将抛出NotSerializableException。
transient关键字
当某个字段被声明为transient后,默认序列化机制就会忽略该字段。此处将Person类中的age字段声明为transient,如下所示,
再执行SimpleSerial应用程序,会有如下输出:
arg constructor
[John, null, MALE]
可见,age字段未被序列化。
先上代码
package com.yuan.Serial; public enum Gender { MALE, FEMALE }
然后是需要序列化Person对象
package com.yuan.Serial; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; transient private Integer age; //transient 关键字表面该字段不被序列化 private Gender gender; public Person() { System.out.println("none-arg constructor"); } public Person(String name, Integer age, Gender gender) { System.out.println("arg constructor"); this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } @Override public String toString() { return "[" + name + ", " + age + ", " + gender + "]"; } }
测试类:
package com.yuan.Serial; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SimpleSerial { public static void main(String[] args) throws Exception { File file = new File("C:\\Users\\Oscar\\Desktop\\123.txt"); ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file)); Person person = new Person("John", 101, Gender.MALE); oout.writeObject(person); oout.close(); ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file)); Object newPerson = oin.readObject(); // 没有强制转换到Person类型 oin.close(); System.out.println(newPerson); } }
一、序列化简单说明
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。1.1.1 Serializable的作用
为什么一个类实现了Serializable接口,它就可以被序列化呢?在上节的示例中,使用ObjectOutputStream来持久化对象,在该类中有如下代码:private void writeObject0(Object obj, boolean unshared) throws IOException { ... if (obj instanceof String) { writeString((String) obj, unshared); } else if (cl.isArray()) { writeArray(obj, desc, unshared); } else if (obj instanceof Enum) { writeEnum((Enum) obj, desc, unshared); } else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared); } else { if (extendedDebugInfo) { throw new NotSerializableException(cl.getName() + "\n" + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName()); } } ... }
从上述代码可知,如果被写对象的类型是String,或数组,或Enum,或Serializable,那么就可以对该对象进行序列化,否则将抛出NotSerializableException。
1.1.2 默认序列化机制
如果仅仅只是让某个类实现Serializable接口,而没有其它任何处理的话,则就是使用默认序列化机制。使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大。1.1.3 影响序列化
在现实应用中,有些时候不能使用默认序列化机制。比如,希望在序列化过程中忽略掉敏感数据,或者简化序列化过程。下面将介绍若干影响序列化的方法。transient关键字
当某个字段被声明为transient后,默认序列化机制就会忽略该字段。此处将Person类中的age字段声明为transient,如下所示,
public class Person implements Serializable { ... transient private Integer age = null; ... }
再执行SimpleSerial应用程序,会有如下输出:
arg constructor
[John, null, MALE]
可见,age字段未被序列化。
相关文章推荐
- JAVA系列之对象的序列化与反序列化
- 面向对象-Java对象序列化
- Java对对象的序列化和反序列化
- Java对象序列化使用基础
- java--序列化对象
- java对象表示方式:序列化和反序列化
- Java对象序列化ObjectOutputStream和ObjectInputStream示例
- java中对象的序列化
- 使用 JID 来进行 Java 对象的高性能序列化
- Java —— 序列化对象的存储和读取
- java序列化保存对象的哪些内容
- .NET 和Java 对象 XML序列化 库WOX
- 理解Java对象序列化
- java序列化(对象流)
- java中为什么要进行对象序列化?
- java对象序列化学习笔记
- Java基础学习总结——Java对象的序列化和反序列化
- java 对象序列化
- json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]
- java 对象序列化 RMI