栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java中序列化和反序列化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java中序列化和反序列化

什么是序列化

序列化就是将对象改成二进制的一个过程,为了将对象保存到磁盘或者网络发送。
实现序列化一个四个方式

前两种序列化方法的区别
https://blog.csdn.net/newchitu/article/details/90676537

 Externalizable接口扩展自java.io.Serializable接口。实现java.io.Serializable即可获得对类的对象的序列化功能。而Externalizable可以通过writeExternal()和readExternal()方法可以指定序列化哪些属性。
 Externalizable需要一个无参数构造去重新反序列化时候构造自己函数
  1. Ser方法,没法指定哪些内容可以序列化,那些内容没法序列化灵活性不够
  2. Ser方法不会调用默认构造方法,而ex方法会在反序列化时候默认调用构造方法去构造对象
    3.Ser方法需要序列化Id,而ex方法并不需要

https://securitit.blog.csdn.net/article/details/106694445?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106694445-blog-90676537.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106694445-blog-90676537.pc_relevant_antiscanv2&utm_relevant_index=1

https://my.oschina.net/wangmengjun/blog/1588096
序列化流的操作
就是进行序列化用的流而已

https://www.cnblogs.com/sun-10387834/p/13521725.html

经过本人亲自测试

package com.bjsxt;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Dog implements Externalizable {

    private String name = "我是狗";
    private int age = 12;

    public Dog() {
        this.name = "我是猫";
        this.age = 13;
    }

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

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

    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    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;
    }
}

Externalizable接口,最终会在重新构建对象时候,调用无参构造器方法对对象进行构造,被反序列化回来的的对象数据,和无参构造是一莫一样的。可以用无参构造来构造对象。

加上参数构造会报错。

顺带一提我的序列化工具

package com.bjsxt;

import java.io.*;

public class SerializationUtil {


    
    public static Object deserialize(String fileName) throws IOException,
            ClassNotFoundException {
        FileInputStream fis = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(fis);
        ObjectInputStream ois = new ObjectInputStream(bis);
        Object obj = ois.readObject();
        ois.close();
        return obj;
    }

    
    public static void serialize(Object obj, String fileName)
            throws IOException {

        FileOutputStream fos = new FileOutputStream(fileName);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.close();
    }



}

和测试类

package com.bjsxt;

import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Dog dog = new Dog();

        //book==>Book [name=Hello Java, isbn=ABC123456789, authors=[John, Eric]]

        System.out.println("book==>" + dog);

        
        String fileName = "d:/a.txt";
        SerializationUtil.serialize(dog, fileName);

        
        Dog deserializedBook = (Dog) SerializationUtil.deserialize(fileName);
        //deserializedBook==>Book [name=Hello Java, isbn=ABC123456789, authors=[John, Eric]]
        System.out.println("deserializedBook==>" + deserializedBook);
    }
}

结论就是EX接口最终还是是通过无参构造中的数据来创造了反序列化后的对象。里面可以调用无参构造

防止成员被序列化

1.声明成静态变量
序列化·是对象的问题,跟类无关

2.tranisent序列化的时候防止序列化

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866411.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号