zoukankan      html  css  js  c++  java
  • Java_对象序列化

    对象序列化指的是将在内存中保存的对象变为二进制数据流,这就意味着对象可以保存在文件中或者进行进行传输操作。但是并不是所有的类对象都可以被序列化,如果需要对象序列化,则这个类必须实现java.io.Serializable接口。

    但这个接口没有任何方法定义,因为其描述的是一种能力, 属于标识接口。

    范例:定义可以被序列化的类

    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    class Person implements Serializable{
        private String name;
        private int age;
        public Person(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String toString() {
            return "Person [name = " + name + ",age =" + age + "]";
        }
    }

    以后Person类就可以传输或保存在文件之中了。

    要进行序列化操作,必须依靠java.io.ObjectOuputStream类。

    范例: 序列化对象:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    class Person implements Serializable{
        private String name;
        private int age;
        public Person(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String toString() {
            return "Person [name = " + name + ",age =" + age + "]";
        }
    }
    
    
    public class Hello{
        public static void main(String[] args) throws Exception  {
            ser(new Person("asdf",21));
        }    
        public static void ser(Person per) throws Exception {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:" + File.separator + "person.ser"));
            oos.writeObject(per);
            oos.close();
        }
    }

    结果生成person.ser文件。这种序列化代码是固定的,所以这样的开发操作以后不需要开发者自己处理

     可是这个文件看不懂,想还原要反序列化

    反序列化

     利用ObjectInputStream。

    构造:public ObjectInputStream(InputStream in) throws IOException;

    当取得了ObjectInputStream类之后可以利用下列方法实现反序列化

      public final Object readObject() throws IOException, ClassNotFoundException 

    范例:反序列化

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    class Person implements Serializable{
        private String name;
        private int age;
        public Person(String name,int age) {
            this.name = name;
            this.age = age;
        }
        public String toString() {
            return "Person [name = " + name + ",age =" + age + "]";
        }
    }
    
    
    public class Hello{
        public static void main(String[] args) throws Exception  {
            dser();
        }    
    
        public static void dser() throws Exception {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:" + File.separator + "person.ser"));
            Object obj = ois.readObject();
            System.out.println(obj);
            ois.close();
        }
    }

    结果输出文件里的内容

    ObjectOutputStream输出的信息只能够通过ObjectInputStream读取

    transient关键字

    默认情况一个对象中的所有属性都一定要被序列化下来,如果某些属性不希望序列化,可以使用transient定义

    范例:

        private transient int age;

    序列化操作中age将不被保存。由于transient关键字的作用,当数据被反序列化后,此数据为其对应数据的默认值

    总结:

    我们关心的只有java.io.Serializable接口,几乎简单java类都要实现此接口

    ObjectOutputStream、ObjectInputStream很少由我们自己操作

    transient虽然可以保证属性不被序列化,但很少出现

  • 相关阅读:
    基于微软解决方案的负载测试实现知识库1____(转)理解.NET中的数据库连接池
    [转] Performance vs. load vs. stress testing _Grig Gheorghiu (翻译水平有限,如有错误请帮忙刊正)
    Bill Gates Centimillionaire and one poor man.
    VB Comwrapper 的实现
    使用接口作为返回值
    如何排查SQL死锁的错误?
    VC++动态链接库编程之DLL典型实例
    VC++动态链接库编程之DLL木马
    VC中获取窗口句柄的各种方法 .
    VC++动态链接库编程之MFC扩展 DLL
  • 原文地址:https://www.cnblogs.com/lonske/p/8874866.html
Copyright © 2011-2022 走看看