码迷,mamicode.com
首页 > 编程语言 > 详细

java基础序--列化和反序列化

时间:2018-06-13 22:20:09      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:classname   lan   基础   ati   存储   name   tac   总结   问题   

一、什么是序列化和反序列化:

  序列化:是指把java堆内存中的对象转换成字节(二进制流)的过程。也就是通过某种方式将java对象存储在磁盘内存中,这个过程称为序列化

  反序列化:是把磁盘上的对象转恢复成java对象的过程。

二、序列化和反序列化优点:

  1、分布式系统中,需要把对象在网络传输,需要将对象转换成二进制流形式,需要共享的javabean对象都需要进行序列化。

  2、服务器钝化,服务器发现某些对象好久没有活动,服务器就会将某些对象存储在本地内存中,需要的时候去内存中寻找,然后反序列化成java对象,节省服务器内存。

  总结:①、实现了数据的持久化,通过序列化保存在本地硬盘上。②、利用序列化实现了远程通信。

三、序列化的必要条件:

  1、需要实现Java.lang.Serializable 接口,java中大多类都实现类改接口。例:String Integer

  2、断层会判断,当前对象是 Serializable 的实例,才允许做序列化,Java对象 instanceof Serializable 来判断

  3、jdk中的api:

  ObjectOutputStream 中的 writeObject() 方法进行序列化操作

  ObjectInputStream 中的readObject() 方法进行反序列化操作

技术分享图片

 

  javabean 如果不实现 java.io.Serializable 接口

  技术分享图片

  demo:  

package com.liuxn.Serialization.javaBean;

import java.io.Serializable;

/**
 * Created by Administrator on 2018/6/13.
 * 创建一个javabean 实现 Serializable 接口
 */
public class User implements Serializable {

    //需要进行序列化的字段
    private String name;

    private int age;

    transient private String className;//不需要进行序列化的字段

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public void setAge(int age) {
        this.age = age;
    }

//    public User(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
//
//
//    public User() {
//    }


    @Override
    public String toString() {
        return "User{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", className=‘" + className + ‘\‘‘ +
                ‘}‘;
    }
}
package com.liuxn.Serialization.test;

import com.liuxn.Serialization.javaBean.User;

import java.io.*;

/**
 * Created by Administrator on 2018/6/13.
 *
 * 用于测试序列化和反序列化 测试类
 */
public class TestSerialization {

    public static void main(String[] args) {
        /**
         * 使用ObjectOutputStream实现序列化
         */
        User user = new User();
        user.setAge(10);
        user.setName("小明");
        System.out.println(user);

        ObjectOutputStream oos = null;
        try {
            OutputStream op = new FileOutputStream("F:\\360WiFi"+ File.separator+"a.txt");
            oos = new ObjectOutputStream(op);
            oos.writeObject(user);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         *  ObjectInputStream 实现反序列化
         */
        try {
            InputStream in = new FileInputStream("F:\\360WiFi"+ File.separator+"a.txt");
            ObjectInputStream os = new ObjectInputStream(in);
            byte[] buffer = new byte[10];
            int len = -1;
            User u = (User) os.readObject();
            System.out.println("反序列化:");
            System.out.println(u);
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

  

//输出结果:
User{name=‘小明‘, age=10}
反序列化:User{name=‘小明‘, age=10}

  在序列化时,如果javabean完成序列化后,修改javabean,在次进行反序列化会出现以下问题:

技术分享图片

  解决:

  在javabean中条添加 serialVersionUID 固定版本。

  private static final long serialVersionUID = 1L;

 

 

 

  javabean 

java基础序--列化和反序列化

标签:classname   lan   基础   ati   存储   name   tac   总结   问题   

原文地址:https://www.cnblogs.com/lxn0216/p/9178230.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!