Java 序列化

启用类的可串行性的java类实现。Serializable接口。类没有实现这个接口没有任何状态序列化或反序列化。可序列化类的所有子类型本身是可序列化的。序列化接口没有方法或字段,只确定的语义是可序列化的。
允许non-serializable类的子类型序列化,亚型可能负责保存和恢复状态的超类型的公共、保护,字段(如果可以)包。亚型可能承担这责任只有在它扩展的类有一个可访问的无参数构造函数来初始化类的状态。它是错误的声明一个类可序列化的如果不是这种情况。将在运行时检测到的错误。

反序列化期间,non-serializable类的字段将被初始化使用公共或受保护的无参数构造函数的类。一个不带参数的构造函数必须在子类访问,是可序列化的。可序列化的子类的字段将被恢复的流。

当遍历图,一个对象可能遇到不支持Serializable接口。在这种情况下,将抛出NotSerializableException并将确定non-serializable的类对象。

类需要特殊处理序列化和反序列化过程中必须实现特殊方法与这些确切的签名:

私人空间writeObject(io。ObjectOutputStream) 抛出IOException 私人空间readObject(io。ObjectInputStream) 抛出IOException,ClassNotFoundException; 私人空间readObjectNoData() ObjectStreamException扔;
writeObject方法负责写作对象的特定类的状态,这样相应的readObject方法可以恢复它。默认保存机制可以通过调用out.defaultWriteObject调用对象的字段。该方法不需要关心国家属于它的超类或子类。通过编写单个字段的状态保存ObjectOutputStream使用writeObject方法或使用DataOutput支持的原始数据类型的方法。

readObject方法负责读取流和恢复类的字段。它可能在打电话。defaultReadObject调用默认机制恢复对象的非静态和非暂时性字段。defaultReadObject方法使用流中的信息分配对象的字段保存在相应的流命名字段在当前对象。处理这种情况当类进化到添加新字段。该方法不需要关心国家属于它的超类或子类。通过编写单个字段的状态保存ObjectOutputStream使用writeObject方法或使用DataOutput支持的原始数据类型的方法。

readObjectNoData方法负责初始化对象的状态为其特定类的序列化流不会列出给定类的超类对象被反序列化。这可能发生在这种情况下,接收方使用不同版本的反序列化类的实例比发送方和接收方的版本扩展了类,不是由发送方的扩展版本。这也可能出现序列化流是否被篡改,因此,readObjectNoData有助于正确初始化反序列化对象尽管流“敌意”或不完整的来源。

可序列化的类,需要指定另一个对象时使用的对象写入到流应该实现这个特殊方法的签名:

ANY-ACCESS-MODIFIER对象writeReplace()抛出ObjectStreamException;
这个writeReplace方法调用序列化方法存在,它是否会从类中定义一个方法访问对象的序列化。因此,该方法可以有私人,保护和包的私有访问。子类访问该方法遵循java访问规则。

类时,需要指定一个替代的实例从流读取应该实现这个特殊方法的签名。

ANY-ACCESS-MODIFIER对象readResolve()抛出ObjectStreamException;
这readResolve方法遵循相同的调用writeReplace规则和可访问性规则。

序列化运行时同事每一个可序列化的类版本号,称为serialVersionUID,用于反序列化期间验证发送方和接收方的序列化对象加载的类的对象,是兼容的序列化。如果接收方加载一个类的对象有不同的serialVersionUID比相应的发送方的类,然后反序列化将导致一个InvalidClassException。可序列化的类可以声明自己的serialVersionUID明确通过声明一个名为”serialVersionUID”的领域,必须是静态的,决赛,和long型:

ANY-ACCESS-MODIFIER静态最终长serialVersionUID = 42 l;
如果一个可序列化的类没有显式地声明一个serialVersionUID,序列化运行时将计算serialVersionUID默认值这类基于类的各个方面,如Java(TM)所述对象序列化规范。然而,强烈建议所有可序列化的类显式地声明serialVersionUID的价值观,因为缺省serialVersionUID计算高度敏感类可能取决于编译器实现的细节,并能因此导致意外的 InvalidClassExceptions在反序列化。因此,为了保证serialVersionUID一致的价值在不同的java编译器的实现,一个可序列化的类serialVersionUID必须声明一个显式的值。也强烈建议明确serialVersionUID声明使用 private修饰符在可能的情况下,由于这种声明仅适用于立即声明类继承的成员——serialVersionUID字段不是有用的。不能声明一个数组类显式serialVersionUID,所以他们总是默认的计算值,但要求匹配serialVersionUID值是数组类的放弃。

ObjectStreamDemo.java

package com.whf.demo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/** 
 * @author :辰
 * E-mail: 15538323378@163.com 
 * 创建时间:2017-3-23 下午3:33:51 
 *  
 */
public class ObjectStreamDemo {
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        objread();
        objwrite();
    }
    public static void objwrite() throws FileNotFoundException, IOException
    {
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\feng.txt"));
        oos.writeObject(new person("chen",20));
        oos.close();

    }
    public static void objread() throws FileNotFoundException, IOException, ClassNotFoundException
    {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\feng.txt"));
        person p=(person)ois.readObject();
        System.out.println(p);
        ois.close();          
    }
}
class person implements Serializable
{
    private String name;
    int age;
    person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public  String toString()
    {
        return name+"::"+age;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值