“序列化是将对象状态转换为可保持或可传输的格式的过程”。为什么要序列化,说的很清楚了,就是为了将对象状态进行持久化或者进行传输。注意这里说的是对象状态,所以只有对象的属性变量才会进行序列化,方法是不会序列化的。Java中所有实现Serializable接口的对象就表明是可序列化的。
示例代码:
import java.io.Serializable; public class Person implements Serializable{ private static final long serialVersionUID = -842029427676826563L; public static String name = "Tony"; private int age; private transient int workDay = 5; private String fClub = "Arsenal"; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getWorkDay() { return workDay; } public void setWorkDay(int workDay) { this.workDay = workDay; } public String getfClub() { return fClub; } public void setfClub(String fClub) { this.fClub = fClub; } }
主测试类:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Hello { public static void main(String[] args) { Person person = new Person(); person.setAge(26); person.setWorkDay(7); person.setfClub("Juventus"); try { FileOutputStream fs = new FileOutputStream("foo.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(person); os.close(); Person.name = "Alex"; FileInputStream in = new FileInputStream("foo.ser"); ObjectInputStream s = new ObjectInputStream(in); Person p = (Person) s.readObject(); System.out.println("name==" + Person.name + " age==" + p.getAge() + " workDay==" + p.getWorkDay() + " fClub==" + p.getfClub()); } catch (Exception e) { e.printStackTrace(); } } }
程序的输出结果为:
name==Alex age==26 workDay==0 fClub==Juventus
好了,下面一一解释上面代码的疑点:
1、serialVersionUID有什么用:(网络上的解释)
如果你的类序列化存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。
在Eclipse里写代码时,开始如果没加这个serialVersionUID就有警告提示。Eclipse提供两种生成方式:
一种是默认的1L,比如:private static final long serialVersionUID = 1L;
一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = xxxxL;
2、是不是所有的成员变量都会被序列化
因为静态变量是属于类的,不是属于某个对象的,所以静态成员变量不会被序列化。序列化保存的是对象的状态,而静态变量属于类的状态,在序列化的时候不会被保存。所以上面程序的打印结果,name==Alex,而不是Tony,因为name根本没有被持久化到foo.ser文件中。
用关键字transient修饰的成员变量也不会被持久化。以前还真没接触过transient这个关键字,上网搜了一下对它的解释:“表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。”
序列化保存的文件foo.ser文件里有什么内容,大概也能猜到:
1)对象的类型
2)对象属性的类型
3)对象属性的值
因为保存在文件里不是标准的文本内容,而是一些二进制内容,用Ultraedit以16进制格式打开,虽然有些显示为了乱码,但是大概能看到的也是上面的3个内容。
值得一提的是,当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化,所以当然引用的对象也要是可序列化的。
有关序列化的有用参考文章:
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html
http://www.ibm.com/developerworks/cn/java/j-5things1/
相关推荐
学习Java序列化,里面包含一份PPT以及相应的源码演示
java反序列化工具,覆盖jboss、weblogic、websphere。
java序列化和反序列化java序列化和反序列化java序列化和反序列化
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
大家请看Java的序列化结构有不足的地方请指教也希望指出不足的地方。
java 对象的序列化与反序列化 java 对象的序列化与反序列化
java 序列化详细解释 很详细 适用于高级软件开发者
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
在应用java进行c-s开发的时候,尤其涉及到图片和视频之间的传输时,需要用序列化和反序列化技术,希望对您有帮助
java序列化代码示例,详细讲解序列化作用于使用注意规则项!!!
Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化 Java序列化与反序列化
java 常用序列化和反序列化框架使用demo ,java 常用序列化和反序列化框架使用demo
将java数据 序列化成PHP的格式 a:4:{s:6:"title2";s:13:"这是标题2";s:6:"title3";s:13:"这是标题3";s:5:"title";s:13:"这是标题1";s:6:"title4";s:13:"这是标题4";} 或者a:1:{i:0;a:1:{s:4:"name";s:10:"这是1321";...
java对象 java序列化 java反序列化
java 序列化,java 序列化,java 序列化,java 序列化,java 序列化,java 序列化
android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...
java 的序列化与反序列化举例测试
这是Java序列化标准规范,对于研究序列化源码能够提供指导作用,为深入研究Java序列技术奠定基础。
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。