每天进步一点点-实例为导学-一个java对象序列化的例子

序列化和反序列化例子

如果我们想要序列化一个对象,

对象序列)首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。

写完就睡了,首先: 将FileOutputStream 封装在一个ObjectOutPutStream中

ObjectOutputStream能把Object输出成Byte流  接着直接调用writeObject()方法就可以序列化了

将 序列 转成 对象 也是这2步骤
           

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;  

public class MyTest implements Serializable  {
    private static final long serialVersionUID = 1L;
    private String name="SheepMu";
    private int age=24;
    public static void main(String[] args)   {//以下代码实现序列化
        try{
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("my.out"));//输出流保存的文件名为 my.out ;ObjectOutputStream能把Object输出成Byte流  
            MyTest myTest=new MyTest();
            oos.writeObject(myTest);   //变换
            oos.flush();  //缓冲流  , 马士兵说将内存中的数据全部flush到硬盘文件中
            oos.close(); //关闭流
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        fan();//调用下面的  反序列化  代码
    }
    public static void fan()//反序列的过程
    {
        ObjectInputStream oin = null;//局部变量必须要初始化
        try {
            oin = new ObjectInputStream(new FileInputStream("my.out"));  
        } catch (FileNotFoundException e1){
            e1.printStackTrace();
        } catch (IOException e1){
            e1.printStackTrace();
        }
        MyTest mts = null;
        try {
            mts = (MyTest ) oin.readObject();//由Object对象向下转型为MyTest对象  
        } catch (ClassNotFoundException e) { //向上转型(即是自动进行的) ArrayList的引用变量向List的引用变量; 任何类向Object转型
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
         System.out.println("name="+mts.name);
         System.out.println("age="+mts.age);
    }
}
/**
 * 会在此项目的工作空间生成一个 my.out文件。序列化后的内容稍后补齐,先看反序列化后输出如下:
    name=SheepMu
    age=24
 */


序列化ID

序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。



序列化前和序列化后的对象的关系

是 "=="还是equal? or  是浅复制还是深复制?

答案:深复制,反序列化还原后的对象地址与原来的的地址不同

序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。



序列化会忽略静态变量,即序列化不保存静态变量的状态。静态成员属于类级别的,所以不能序列化。即 序列化的是对象的状态不是类的状态

a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

c) static,transient后的变量不能被序列化;



每天进步一点点-实例为导学-一个java对象序列化的例子

时间: 2024-10-08 00:11:24

每天进步一点点-实例为导学-一个java对象序列化的例子的相关文章

Java 对象序列化详解以及实例实现和源码下载

Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何代码支持 3 性能略差 实现Externalizable接口 1 程序员决定存储哪些信息 2 仅仅提供两个空方法,实现该接口必须为两个空方法提供实现 3 性能略好 一 由于实现Externalizable接口导致了编程复杂度的增加,所以大部分时

Python入门+进阶 第1章 Python入门导学(无论何时,只要开始就不晚)

1. Python入门导学 1.1 Python概念 Python(英国发音:/?pa?θ?n/ 美国发音:/?pa?θɑ?n/) 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构. Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言. Python 是交互式语言: 这意味着,您可以在一个Python提示符

《C++语言导学》小记

我看的这本是Bjarne Stroustrup写的,南开大学的杨巨峰和王刚译的.这本书不适合初学者看,我就是大概翻了翻其中感兴趣的章节. 这本书第14章的标题是“历史和兼容性”,这节内容我看了收获很深.p144-145的内容值得去看. 从中可以看出,ISO C和ISO C++是K&R C [Kernighan, 1978] 的两个主要后代,因此它们是兄弟.两者发展过程中都从经典C继承了关键特性,但又不都是100%兼容经典C. <C++语言导学>p144 2011年,C++11和C11相

C++ STL轻松导学

作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙 花一现.本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情. 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知 道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事.因此,如果

学习Spring必学的Java基础知识(2)----动态代理

学习Spring必学的Java基础知识(2)----动态代理 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www

Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.其实它可以被看作是RPC的Java版本.但是传统RPC并不能很好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用. RMI目前使用Java远程消息交换协议JRMP(Java Remot

static特别用法【静态导包】——Java包的静态导入

面试我问你static关键字有哪些作用,如果你答出static修饰变量.修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满意,因为能看出你非常热衷研究技术. 于是乎查找资料如下: 静态导包就是Java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性. 一般我们导入一个类都用 import com-..ClassName;而静态导入是这样:import static com-..ClassName.

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”

之前在<亚马逊AWS学习--EC2的自定义VPC配置>这篇文章中讲述了如何设置自定义VPC并使自己的EC2实例能够连接公网.本篇说一下连接公网时会出现的一个小问题. 如题所示,在一个EC2实例具有多个网络接口的环境下,如果为其配置公网连接会有一个"bug".其实也不能说是"bug",而是AWS网络环境的限制. 1. 主网络接口 我们知道,很多时候我们的一台主机需要有多个网络接口,以使其同时架设在不同的网络中.EC2实例创建时会有一个主网络接口,默认描述为