文档章节

java序列化与反序列化

passionfly
 passionfly
发布于 2015/02/13 18:27
字数 554
阅读 18
收藏 1

首先解释两个概念,何为序列化?何为反序列化?

序列化:将对象转化成流的过程称为序列化

反序列化:将流转化成对象的过程称之为反序列化

序列化与反序列化必须遵守的原则

a)         Java对象

java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口

java.io.Serializable接口定义如下:

publicinterface Serializable {
}

从上述定义中可以看到该接口中未定义任何方法,这大大的简化了开发者

b)      序列化主要依赖java.io.ObjectOutputStream,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能

Demo:

/**
     *将对象序列化到磁盘文件中
     *@paramo
     *@throwsException
     */
    publicstaticvoid writeObject(Object o) throws Exception{
       File f=new File("d:""user.tmp");
       if(f.exists()){
           f.delete();
       }
       FileOutputStream os=new FileOutputStream(f);
       //ObjectOutputStream 核心类
       ObjectOutputStream oos=new ObjectOutputStream(os);
       oos.writeObject(o);
       oos.close();
       os.close();
    }

c)      反序列化主要依赖java.io.ObjectInputStream,该类对java.io.InputStream进一步做了封装,这里主要使用ObjectInputStream类的readObject()方法实现序列化功能

Demo:

/**
     *反序列化,将磁盘文件转化为对象
     *@paramf
     *@return
     *@throwsException
     */
    publicstatic User readObject(File f) throws Exception{
       InputStream is=new FileInputStream(f);
       //ObjectOutputStream 核心类
       ObjectInputStream ois=new ObjectInputStream(is);
       return (User)ois.readObject();
    }

完整代码:

package com.io.bean;
import java.io.Serializable;
publicclass User implements Serializable {
   
    privateintuserId;
    private String userName;
    private String userSex;
    privateintuserAge;
    publicint getUserAge() {
       returnuserAge;
    }
    publicvoid setUserAge(int userAge) {
       this.userAge = userAge;
    }
    publicint getUserId() {
       returnuserId;
    }
    publicvoid setUserId(int userId) {
       this.userId = userId;
    }
    public String getUserName() {
       returnuserName;
    }
    publicvoid setUserName(String userName) {
       this.userName = userName;
    }
    public String getUserSex() {
       returnuserSex;
    }
    publicvoid setUserSex(String userSex) {
       this.userSex = userSex;
    }
    @Override
    public String toString() {
       returnthis.getUserId() + "   " + this.getUserName() + "   "
              + this.getUserSex() + "    " + this.getUserAge();
    }
}

序列化与反序列化

package com.io.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.io.bean.User;
publicclass TestSerializable {
    /**
     *将对象序列化到磁盘文件中
     *@paramo
     *@throwsException
     */
    publicstaticvoid writeObject(Object o) throws Exception{
       File f=new File("d:""user.tmp");
       if(f.exists()){
           f.delete();
       }
       FileOutputStream os=new FileOutputStream(f);
       //ObjectOutputStream 核心类
       ObjectOutputStream oos=new ObjectOutputStream(os);
       oos.writeObject(o);
       oos.close();
       os.close();
    }
   
    /**
     *反序列化,将磁盘文件转化为对象
     *@paramf
     *@return
     *@throwsException
     */
    publicstatic User readObject(File f) throws Exception{
       InputStream is=new FileInputStream(f);
       //ObjectOutputStream 核心类
       ObjectInputStream ois=new ObjectInputStream(is);
       return (User)ois.readObject();
    }
   
   
    publicstaticvoid main(String[] args) throws Exception{
      
       /*****************将对象序列化***************/
      
    /* 
        User user=new User();
       user.setUserId(1);
       user.setUserName("张艺谋");
       user.setUserSex("男");
       user.setUserAge(50);
       TestSerializable.writeObject(user);
    */
      
       /*****************将对象序反列化***************/
      
       User user=TestSerializable.readObject(new File("d:""user.tmp"));
       System.out.println(user);
    }
}



























本文转载自:http://www.blogjava.net/sxyx2008/

共有 人打赏支持
passionfly
粉丝 14
博文 106
码字总数 76465
作品 0
西安
加载中

评论(1)

-飞客-
-飞客-
好帖子!79
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
05/08
0
0
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
(1)java序列化--java.io.Serializable接口解析

(PS:本文为作者原著,如需转载,请注明出处-_^) 使用java以来,序列化随处可见,至于为什么要用序列化、序列化能解决什么问题,作为一个普通的码农,一般不怎么会去深入研究,由于最近在看...

sumekey
2011/09/07
0
0
Java反序列化漏洞的原理分析

  *本文原创作者:Moonlightos,本文属FreeBuf原创奖励计划,未经许可禁止转载   世界上有三件事最难:      把别人的钱装进自己的口袋里   把自己的想法装进别人的脑袋里   让自...

FreeBuf
05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ReentrantLock_可重入

package cunrent;import java.util.Calendar;import java.util.concurrent.locks.ReentrantLock;public class TestReentrantLock { public static void main(String[] args......

noteman
35分钟前
2
0
CentOS7下安装mysql5.7

1、安装YUM Repo 由于CentOS 的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件。 wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm 然后进行repo的安...

JungleKing
43分钟前
2
0
DevExpress v18.1新版亮点——DevExtreme篇(三)

用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容。本文将介绍了DevExtreme JavaScript Controls v18.1 的新功能,快来下载试用新版本!点击下载...

Miss_Hello_World
43分钟前
1
0
LoadRunner 安装

如果安装LoadRunner 11时弹窗提示"Micosoft Visual C++ 2005 SP1 可再发行组件包(X86):'命令行选项语法错误。键入命令 / ? 可获得帮助信息'"。或者弹窗提示"此计算机缺少 vc2005_sp1_wit...

ww1234
52分钟前
1
0
两个时间段相隔自然月Util

public class DateUtil { public static int getDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calend......

木九天
55分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部