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

    参考:

    Java序列化示例教程: http://www.importnew.com/14465.html
    深入学习 Java 序列化: http://www.importnew.com/24490.html
    浅析若干Java序列化工具:http://www.importnew.com/20125.html
    深入分析Java的序列化与反序列化:http://www.importnew.com/18024.html
    Java序列化漏洞对数百万应用造成威胁: http://www.importnew.com/19963.html

           经过上述一些列文章的阅读,你会重新认识什么是序列化,jdk序列化与反序列化的用处,怎么实现序列化以及原理,以及原生序列化的方式和其他开源实现的优劣等。
           序列化是持久化对象为二进制字节码,反序列化则是相反过程。首先它的用处是持久化指定对象,或者如rpc时进行网络传输以二进制形式,传输前序列化,接收端则反序列化为对象使用!
           序列化使用过程以及如何做到防漏洞,以及源码的解读,请参考上文这里不赘述。

    简单的例子:

    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class Dog implements Serializable{
        private static final long serialVersionUID = 6632289998332231262L;
        private String name;
        private int age;
        private String type;
    
        transient String color = "red";
        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 String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        @Override
        public String toString() {
            return "Dog [name=" + name + ", age=" + age + ", type=" + type + ",color="+ color+ "]";
        }
    
        /**
         * transient修饰的变量是不会被持久化的,而是将其变量读取为初始值,但是如果仍然像要持久化的话,只能在序列化对象中
         *  定义此下两个方法,他们会在序列化或反序列化过程中被调用。
         * 
         */
        private void writeObject(ObjectOutputStream os) throws IOException {
            //调用默认读取方法,获取常规属性
            os.defaultWriteObject();
            //需要特别对待 transient 修饰的变量
            os.writeObject(color);
        }
    
        private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
            //调用默认读取方法,获取常规属性
            is.defaultReadObject();
            //需要特别对待 transient 修饰的变量
            color = (String) is.readObject();
    
        }
    
    }
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutput;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    
    /**
     * @author Kevin
     * 
     * 
     * 序列化  需要實現serializable接口。
     * 
     * ObjectOutputStream 、 ObjectInputStream 进行序列化和反序列化。分别是使用writeObject、readObject方法
     * 
     * transient修饰的变量不会被序列化,需要在序列化对象中writeObject readObject 重新修改一番。(可以
     * 探寻ArrayList中transient Object[] elementData;但是为什么仍然会在反序列化获取到数组元素?)
     *
     */
    public class SerializDemo {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            Dog dog = new Dog();
            dog.setAge(20);
            dog.setName("Tom");
            dog.setType("泰迪");
    //      Dog.setColor("yellow");
    
    
            OutputStream opm = new FileOutputStream("D:\test\dog.out");
            ObjectOutput oop = new ObjectOutputStream(opm);
            oop.writeObject(dog);
            oop.close();
    
    
            FileInputStream fis = new FileInputStream("D:\test\dog.out");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object obj = ois.readObject();
            ois.close();
            System.out.println(obj);//Dog [name=Tom, age=20, type=泰迪,color=red]
    
        }
    
    }
  • 相关阅读:
    dart 库
    dart effective-设计
    Python3-Set
    python 基本输入和输出+变量和基本对象
    python 基本语法元素
    模版方法模式 展现程序员的一天
    外观模式 一键电影模式
    装饰者模式 带你重回传奇世界
    命令模式 之 管理智能家电
    适配器模式 以手机充电器为例
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608363.html
Copyright © 2011-2022 走看看