关于Serializable的用法,为什么要实现Serializable?对象为什么要序列化

来源:互联网 发布:迪优美特i5网络机顶盒 编辑:程序博客网 时间:2024/04/20 10:10

        实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化。比如一些MQ应用中,一般做法就会将对象进行序列化处理

        一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
什么情况下需要序列化
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。

    总结一下:  序列化的作用就是为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制,效率之高,是其他解决方案无法比拟的

举个例子:

//枚举类也是实现了Serializable接口,所以枚举对象都是默认可以被序列化的

public enum Gender {MALE,FEMALE} 
//Person对象实现序列化并重写toString为了打印public class Person implements Serializable{private String name;private int age;private Gender gender;public String getName() {return name;}public Person(){System.out.println("none-arg constructor");}public Person(String name, int age, Gender gender){System.out.println("arg constructor");this.name = name;this.age = age;this.gender = gender;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";}}
//SimpleSerial是一个简单的序列化程序,它先将一个Person对象保存到文件person.out中,//然后再从该文件中读出被存储的Person对象,并打印该对象。public class SimpleSerial {public static void main(String[] args) throws Exception {File file = new File("Person.out");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();        oin.close();        System.out.println(newPerson);}}



 







阅读全文
0 0
原创粉丝点击