➠更多技术干货请戳:听云博客序列化什么是序列化序列化:保存对象的状态反序列化:读取保存对象的状态序列化和序列化是Java提供的一种保存恢复对象状态的机制序列化有什么用将数据保存到文件或数据库中时将数据通过套接字在网络上传输时通过 RPC RMI等传输对象时如何序列化实现Seria ...
➠更多技术干货请戳:听云博客
序列化
什么是序列化
序列化:保存对象的状态
反序列化:读取保存对象的状态
序列化和序列化是Java提供的一种保存恢复对象状态的机制
序列化有什么用
将数据保存到文件或数据库中时
将数据通过套接字在网络上传输时
通过 RPC RMI等传输对象时
如何序列化
实现Serializable接口
实现Externalizable接口
serialVersionUID的作用serialVersionUID建议给一个确定的值,不要由系统自动生成,否则在增减字段(不能修改字段类型及长度)时,如果两边的类的版本不同会导致反序列化失败
默认序列化机制
如果仅仅只是让某个类实现Serializable接口,而没有其它任何处理的话,则就是使用默认序列化机制。使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大。
(01) 序列化对static和transient变量,是不会自动进行状态保存的。
transient的作用就是,用transient声明的变量,不会被自动序列化。
(02) 对于Socket, Thread类,不支持序列化。若实现序列化的接口中,有Thread成员;在对该类进行序列化操作时,运行会出错。
这主要是基于资源分配方面的原因。如果Socket,Thread类可以被序列化,但是被反序列化之后也无法对他们进行重新的资源分配。
示例:
package ioEx; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Serial { private static final String TMP_FILE = "text.txt"; public static void main(String[] args) { testWrite(); testRead(); } private static void testWrite() { try { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(TMP_FILE)); AnObject box = new AnObject(1, 1, "1"); out.writeObject(box); out.writeBoolean(true); out.writeByte((byte)65); out.writeChar('a'); out.writeInt(20160415); out.writeFloat(3.14F); out.writeDouble(Math.PI); HashMap<String,String> map = new HashMap<String,String>(); map.put("a", "a"); map.put("b", "b"); map.put("c", "c"); out.writeObject(map); out.close(); } catch (Exception ex) { ex.printStackTrace(); } }private static void testRead() { try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(TMP_FILE)); AnObject box = (AnObject) in.readObject(); System.out.println("testWrite box: " + box); System.out.println("boolean:"+ in.readBoolean()); System.out.println("byte:" + (in.readByte()&0xff)); System.out.println("char:" + in.readChar()); System.out.println("int:" + in.readInt()); System.out.println("float:" + in.readFloat()); System.out.println("double:" + in.readDouble()); // 读取HashMap对象 HashMap<String,String> map = (HashMap<String,String>) in.readObject(); Iterator<Entry<String, String>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String,String> entry = (Entry<String, String>)iter.next(); System.out.println(entry.getKey()+"--"+ entry.getValue()); } in.close(); } catch (Exception e) { e.printStackTrace(); } }}class AnObject implements Serializable { private int obja; private int objb; private String objc; private static int statica; private transient int transienda; //必须用static或transient修饰才可能序列化,否则运行报错 private static transient Thread thread = new Thread() { @Override public void run() { System.out.println("Serializable"); } }; public AnObject(int obja, int objb, String objc) { this.obja = obja; this.objb = objb; this.objc = objc; this.statica=obja; this.transienda=obja; } //如果要使transient序列化要重写writeObject,和readObject 方法// private void writeObject(ObjectOutputStream out) throws IOException{ // out.defaultWriteObject();// out.writeInt(transienda); // }//// private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{ // in.defaultReadObject();// transienda = in.readInt(); // } @Override public String toString() { return "obja:"+obja+","+ "objb:"+objb+","+ "objc:"+objc+","+ "statica:"+statica+","+ "transienda:"+transienda; }}
原标题:JAVA IO 序列化与设计模式
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。