zoukankan      html  css  js  c++  java
  • Java序列化

    什么是序列化,什么是反序列化

    序列化

    把对象转换为字节序列的过程称为对象的序列化

    反序列化

    把字节序列恢复为对象的过程称为对象的反序列化

    为什么序列化

    • 持久存储时
    • 网络传输时
    • 通过RMI传输对象时

    如何实现序列化

    实现方式

    实现Serializable接口

    遇到的问题

    • transient 修饰的属性,不会被序列化
    • 静态static的属性,它不序列化
    • 实现这个Serializable接口的时候,SerialVersionUID赋值
    • 当属性是对象的时候,对象也有实现序列化接口

    示例代码:

    定义一个对象FlyPig对象:

    package test;
    
    import java.io.Serializable;
    
    public class FlyPig implements Serializable {
        private static final long serialVersionUID = 1L;
        private static String AGE = "269";
        private String name;
        private String color;
        transient private String car;
    
        public static String getAGE() {
            return AGE;
        }
    
        public static void setAGE(String AGE) {
            FlyPig.AGE = AGE;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public String getCar() {
            return car;
        }
    
        public void setCar(String car) {
            this.car = car;
        }
    }
    

    编写测试类:

    package test;
    
    import java.io.*;
    
    public class serializableTest {
        public static void main(String[] args) throws Exception{
            serializeFlyPig();
            FlyPig flyPig = deserializeFlyPig();
            System.out.println(flyPig.getAGE()+ " " + flyPig.getName() + " " + flyPig.getColor() + " " + flyPig.getCar());
        }
    
        //序列化
        private static void serializeFlyPig() throws Exception {
            FlyPig flyPig = new FlyPig();
            flyPig.setName("riemann");
            flyPig.setColor("black");
            flyPig.setCar("audi");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("/home/cyp/flypig.txt")));
            objectOutputStream.writeObject(flyPig);
            System.out.println("flyPig对象序列化完成");
            objectOutputStream.close();
        }
    
        //反序列化
        private static FlyPig deserializeFlyPig() throws Exception {
            ObjectInputStream objectinputStream = new ObjectInputStream(new FileInputStream(new File("/home/cyp/flypig.txt")));
            FlyPig flyPig = (FlyPig)objectinputStream.readObject();
            System.out.println("flypig对象反序列化完成");
            return flyPig;
        }
    }
    

    运行结果:

    flyPig对象序列化完成
    flypig对象反序列化完成
    269 riemann black null
    

    通过运行结果我们发现,通过transient修饰的属性car反序列化后的值为null,说明其不能被反序列化,但是静态变量AEG的值仍是269,难道它也被序列化了?当然不是,下面进行测试:

    在定义的FlyPig对象的类中,把AEG的值由269改成26,现在,如果AEG被序列化了,那么序列化后AEG的值仍是269,反序列化后显示的值应该也是269,所以,这次我们只运行serializeTest类中的反序列化方法,可以在main方法中把序列化方法注释掉,如下所示:

    public static void main(String[] args) throws Exception{
            //serializeFlyPig();
            FlyPig flyPig = deserializeFlyPig();
            System.out.println(flyPig.getAGE()+ " " + flyPig.getName() + " " + flyPig.getColor() + " " + flyPig.getCar());
        }
    

    然后运行代码,运行结果为:

    flypig对象反序列化完成
    26 riemann black null
    

    我们发现,AEG的值变成了26,说明static修饰的属性AEG并没有被序列化。

  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/youpeng/p/11257837.html
Copyright © 2011-2022 走看看