java基础--序列化一之使用

1.什么是序列化

序列化就是将对象的状态信息转换为可以存储或传输的形式,使对象可以持久化的保存。

2.什么是持久化

就是可以长久的保存对象。比如将对象保存在文件中、将对象保存在网络中、远程的传输获取对象,随取随用。

3.java中实现对象的序列化有两种方法

  • 实现Serializable接口
  • 实现Externalizable接口

4.实现Serializable接口的代码

User类:里面的age属性被transient修饰

public class User implements Serializable {
    private String name;
    transient private int age;//这个值不序列化
    private Man man;

    public User(String name,int age,Man man){
        this.name=name;
        this.age=age;
        this.man=man;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Man getMan() {
        return man;
    }

    public void setMan(Man man) {
        this.man = man;
    }

Man类:实现了Serializable接口

public class Man implements Serializable {
    private String name;

    public Man(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

执行类:

 
public class Main {
    public static void main(String[] args)throws Exception{
        Main.write();
        Main.read();
    }

    public static void write()throws Exception{
        Man man=new Man("小新");
        User user=new User("大新",18,man);
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:/test/111.txt"));
        oos.writeObject("测试");
        oos.writeObject(user);
        oos.close();
    }

    public static void read()throws Exception{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:/test/111.txt"));
        String str=(String)ois.readObject();
        User user=(User)ois.readObject();
        ois.close();
        System.out.println(str+",userName:"+user.getName()+",userAge:"+user.getAge()+",manName:"+user.getMan().getName());
    }
}

返回的结果:测试,userName:大新,userAge:0,manName:小新

其中age因为被transient修饰,所以age结果为0。

上述代码还要注意的是如果Man类没有实现Serializable接口,那么将会报错!也就是说序列化的对象包含的对象也要实现序列化

5.实现Externalizable接口的代码

User类:

 
public class User implements Externalizable{
    private String name;
    private Integer age;//这儿取的Integer

    public User(){

    }
    public User(String name,Integer age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public void readExternal(ObjectInput in)throws IOException, ClassNotFoundException{
        name=(String)in.readObject();
        age=in.readInt();
    }

    @Override
    public void writeExternal(ObjectOutput out)throws IOException {
        out.writeObject(name);
        out.writeInt(age);
    }
}

执行类:

public class Main {

    public static void main(String[] args)throws Exception{
        User user=new User("小新",18);
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:/111.txt"));
        oos.writeObject(user);
        oos.close();

        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:/111.txt"));
        User result=(User)ois.readObject();
        ois.close();
        System.out.println("姓名:"+result.getName()+",年龄:"+result.getAge());
    }
}

返回的结果:姓名:小新,年龄:18

注意Integer类型的readInt()和writeInt(),String类型是属于Object的。

还有一个特别要注意的是User必须要有默认的构造方法。否则会报错。

猜你喜欢

转载自blog.csdn.net/wangzx19851228/article/details/80500161
今日推荐