序列化,反序列话实例

public class foo implements Serializable{
    private int width;
    private int height;
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    
}

public class test_serialize extends TestCase {

//序列化,fileoutputstream 存储路径文件,如果是相对路径,那么存储在项目根目录下,如果是绝对路径,存储在绝对路径下面
    public void tests() throws IOException{
        foo a = new foo();
        a.setHeight(200);
        a.setWidth(300);
        foo b = new foo();
        b.setHeight(300);
        b.setWidth(400);
        try{
        FileOutputStream fs=new FileOutputStream("d:/foo.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        os.writeObject(a);
        os.writeObject(b);
        os.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

//反序列化
    public void testgets() throws IOException, ClassNotFoundException{
        try {
            FileInputStream fs = new FileInputStream("d:/foo.ser");
            ObjectInputStream ois = new ObjectInputStream(fs);
            foo a=(foo)ois.readObject();
            foo b=(foo)ois.readObject();
            System.out.println(a.getHeight());
            System.out.println(b.getHeight());
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

相关注意事项
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输  等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分  配,而且,也是没有必要这样实现。

默认的 serialization 对 类的结构有要求,一般将来版本升级了导致服务端和客户版本不一样,或者你用新版本读取一个以前旧版本写入磁盘的序列化的对象的话,需要这两个版本是兼容 的,达到这个要求至少包括下面这个字段,并且新旧两个版本的类中它的值应该是一样的,其它特殊情况规范也有办法做到,比如你的结构变了,以前 name / phone 都是 A 的字段,后来新版本创建了一个内部类叫 Contact 把 name 和 phone
并到这两个字段移到内部类 Contact 中去了的话,Java 也有办法在新版本中提供自定义 readObject/writeObject 这个过程来确保兼容旧版本。
private static final long serialVersionUID; // 在一个类的多个版本中要相同的值,对于不它的类中,它们的值不要求唯一。
http://java.sun.com/developer/technicalArticles/Programming/serialization/

serialVersionUID作用:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 有两种生成方式: 一个是默认的1L,比如:private static final long se...

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
  private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会
自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也
可以把它关掉的,设置如下:
  Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>
Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。
如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。

时间: 2024-10-24 19:06:31

序列化,反序列话实例的相关文章

序列化和反序列话

定义: 首先来介绍一下什么是序列化和反序列化,下面是序列化和反序列话的定义 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 序列化的作用: 在介绍序列化的作用之前,请大家思考一个问题,对象是如何存储的,以及对象是如何传输的? 是的,这个问题的答案就是序列化的作用,那么对象是如何存储的呢? 1. 把对象串行化为二进制数据 2. 把对象串行化为格式化数据(比如Json序列化.XML序列化) 可以把串行化后的二进制数据或文件存储到磁盘等设

php unserialize函数反序列话数组

有没有,遇到这种情况:使用serialize函数序列化一个数组后,然后想通过unserialize函数反序话,得到该数组,可是确报错,得不到想要的结果. 从网上搜索,发现很多网友都遇到相同的问题,好像说这是unserialize函数的bug. 不过,好在有人已经解决了,我就借花献佛,将他记录下来,供大家使用: 1.假如,是utf-8的数据,请使用下面的函数反序列化(我没有验证,可以尝试下) function mb_unserialize($serial_str) { $serial_str= p

C#序列化与反序列化实例

本文实例讲述了C#序列化与反序列化的方法.分享给大家供大家参考.具体分析如下: 把"对象"转换为"字节序列"的过程称为对象的序列化.     把"字节序列"恢复为"对象"的过程称为对象的反序列化. 序列化 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; usi

.net实现序列化与反序列化实例解析

序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法.具体如下: 一般来说,.net中的 序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件 (注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的所以要在相关类中加上 [Serializable]特性 对象类型包括:对象本身包含的类型,父类 拥有需要的对象之后: 1.将对象转换为二进制数据 使用专门的对像进行转换 BinaryFormatter 2.将二进制数据写入到文件 F

Android 序列化 反序列功能

1 /** 2 * 序列化对象 3 * 4 * @return 序列化后的字符串 5 */ 6 private String serializeObject(Object object) { 7 ByteArrayOutputStream byteArrayOutputStream=null; 8 ObjectOutputStream objectOutputStream=null; 9 String serStr=""; 10 try{ 11 byteArrayOutputStrea

序列化xml文件实例——天气预报

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=&qu

json反序列话 时间格式

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Runtime.Serialization.Json;using System.Text;using System.Threading.Tasks;using System.Text.RegularExpressions; namespace Fjc.DBUtility{ public static class

Hadoop序列化机制及实例

序列化 1.什么是序列化? 将结构化对象转换成字节流以便于进行网络传输或写入持久存储的过程. 2.什么是反序列化? 将字节流转换为一系列结构化对象的过程. 序列化用途: 1.作为一种持久化格式. 2.作为一种通信的数据格式. 3.作为一种数据拷贝.克隆机制. Java序列化和反序列化 1.创建一个对象实现了Serializable 2.序列化:ObjectOutputStream.writeObject(序列化对象) 反序列化:ObjectInputStream.readObject()返回序列

drf序列化器的实例

应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views import View from django.http import JsonResponse, QueryDict from bookset.models import BookInfo #导入序列化列 from .serializers import BookInfoSerializer #####