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

    序列化:将对象转换为字节序列的过程

    反序列化:将字节序列转换为对象的过程

    原因:转换为字节序列后,保存字节码文件,方便网络的传输。

     Person类

    package demo1.serializable;
    
    import java.io.Serializable;
    
    public class Person implements Serializable {
    
    
        public int id;
        private static final long serialVersionUID = 1L;
    //    private static final long serialVersionUID = 2L;
        public Person(int id) {
            this.id = id;
        }
    
    
    }

    Test测试类

    package demo1.serializable;
    
    import java.io.*;
    
    public class Test {
    
        public static void serializablePerson(Person person) throws IOException {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.txt"));
            out.writeObject(person);
            System.out.println("序列化成功");
            out.close();
        }
    
        public static Person deserializablePerson(String filePath) throws IOException, ClassNotFoundException {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath));
            System.out.println("反序列化成功");
            return (Person)in.readObject();
        }
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Person per = new Person(1);
            serializablePerson(per);
    //        System.out.println(deserializablePerson("file.txt"));
        }
    }
    以上序列化、反序列化都成功!

    皮一下-1!
    1.序列化时设置序列化ID
    private static final long serialVersionUID = 1L;
    2.修改Person类的序列化ID,进行反序列化
    private static final long serialVersionUID = 2L;
    最终结果:
    Exception in thread "main" java.io.InvalidClassException: demo1.serializable.Person; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
        at demo1.serializable.Test.deserializablePerson(Test.java:17)
        at demo1.serializable.Test.main(Test.java:22)
    
    

    由此证明:反序列化时:序列化ID不对,是无法序列化成功的。

    再皮一下-2

    1.序列化时设置序列化ID
    private static final long serialVersionUID = 1L;
    2.给Person添加属性int age,再反序列化
    最终结果:
    反序列化成功
    Person{id=1, age=0}

    害,也就是说,序列化ID是一样的就是无敌咯!!!

    再皮一下下-3

    1.颠倒id、age的位置

     没得用,仔细想想也是没用的,nt了。

    突发奇想:反序列化的时候到底是怎么找到对应的字段并赋值的,是构造方法的顺序,还是名字!

    1.修改构造方法

    序列化时,Person类如下:

    package demo1.serializable;
    
    import java.io.Serializable;
    
    public class Person implements Serializable {
    
    
        public String name;
        public int id;
        private static final long serialVersionUID = 1L;
        public Person(int id) {
            this.id = id;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", name=" + name +
                    '}';
        }
    }

    反序列化时,Person类如下:

    package demo1.serializable;
    
    import java.io.Serializable;
    
    public class Person implements Serializable {
    
    
        public String name;
        public int id;
        private static final long serialVersionUID = 1L;
        public Person(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", age=" + id +
                    '}';
    }

    由此证明:反序列化,是通过属性名来找到对应的属性值来反序列化的!!!
    另外:
    序列化使用:ObjectOutputStream类
    反序列化使用:ObjectInputStream类


  • 相关阅读:
    远程桌面连接偶尔无法连接的解决方案
    事物复制遇到的几个错误
    几条关于查看和删除发布和分发的命令
    Winform- TreeView的使用例子
    Winform- 界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用
    Winform- IrisSkin.dll轻松实现窗体换肤功能
    Oracle- 备份单表结构和单表数据
    MSSQLSERVER数据库- 作业调度定时备份数据库
    Oracle- plsql developer如何查询SQL语句执行历史记录
    MSSQLSERVER数据库- SQL删除重复数据的五种方式
  • 原文地址:https://www.cnblogs.com/sicheng-li/p/12942312.html
Copyright © 2011-2022 走看看