Serializable:自定义序列化

原创 2015年07月08日 13:49:24

序列化对象可以自定义序列化,也可以使用默认序列化
如何选择呢?
这就要从序列化的目的说起,序列化的目的简单来说就是保存,之后可以还原,这就是说只要我们能达到这个目的,都是ok的。如果都ok那么就可以选择更ok的形式。

看下面这个例子:
OddNum 这是一个极其没有道理的例子,只是为了说明问题

public class OddNum implements Serializable
{
    /**
     * 
     */
    private transient static final long serialVersionUID = 9030591748255175591L;
    //默认序列化对static成员不进行序列化
    //默认序列化对transient修饰的对象不进行序列化,反序列化时给默认值,对于这里的Integer来说就是null
    private transient Integer[] is = new Integer[100];

    public OddNum()
    {
        for(int i=0;i<is.length;i++)
        {
            is[i] = i*2+1;
        }
    }

    private void writeObject(ObjectOutputStream out) throws IOException
    {
        out.defaultWriteObject();
        out.writeInt(is.length);
        System.out.println("");
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        in.defaultReadObject();
        int capacity = in.readInt();
        is = new Integer[capacity];
        for(int i=0;i<capacity;i++)
        {
            is[i] = i*2+1;
        }
    }

    public Integer[] getIs() {
        return is;
    }

}

使用默认序列化是ok的。
因为Integer[]的值仅仅与length有关,只要拿到length我们就可以还原原始的对象,所以选择仅仅序列化length也是可以达到目的,所以选择自定义序列化也是ok的。
现在就再这两种方式中哪一种比较好呢,你会选择将整个数组序列化,还是仅仅序列化一个int值,很显然选择自定义序列化只序列化length是更好的选择。

测试程序

@Test
public void testOut00() throws FileNotFoundException, IOException
{
    OddNum o = new OddNum();
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\temp00.txt"));
    out.writeObject(o);
    out.flush();
    out.close();
}

@Test
public void testIn00() throws FileNotFoundException, IOException, ClassNotFoundException
{
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\temp00.txt"));
    OddNum o = (OddNum)in.readObject();
    in.close();
    Integer[] is = o.getIs();
    for(Integer temp : is)
    {
        System.out.print(temp+" ");
    }
}

解释一下readObject:

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
    in.defaultReadObject();
    int capacity = in.readInt();
    is = new Integer[capacity];
    for(int i=0;i<capacity;i++)
    {
        is[i] = i*2+1;
    }
}

反序列化其实是重新构造了一个新的实例,可以将反序列化看做是一个以流为参数的构造函数。
这里的is就是反序列化时,生成的新的对象的成员。由于is被transient 修饰,in.defaultReadObject()执行完以后,它的值是null,所以这里需要is = new Integer[capacity]初始化一下,然后通过拿到的length赋值。这样就还原了序列化之前的对象。

从过去几个测试程序可以看出,序列化无论怎么实现,用法是完全一样的,之后就不再写测试程序了。

对Java Serializable(序列化)的理解和总结

我对Java Serializable(序列化)的理解和总结 博客分类:  Java技术 JavaOSSocketCC++  1、序列化是干什么的?        简单说就是...
  • dreamtdp
  • dreamtdp
  • 2013年11月11日 20:00
  • 46834

C# Serializable对象序列化的作用

1、序列化定义:将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。 在此过...
  • yinghuolsx
  • yinghuolsx
  • 2017年04月07日 11:40
  • 852

TreeSet自定义Comparator后序列化与反序列化问题

碰到一个比较郁闷的问题,在TreeSet中定义了一个Comparator之后出现了序列化对象失败的问题。有兴趣可以尝试一下。 最后Google了一下发现这是一个bug,或者其实也算不上bug,具体可...
  • Ididcan
  • Ididcan
  • 2012年08月17日 09:06
  • 3070

深入理解Java中的序列化(Serializable)

深入理解Java中的序列化(Serializable)
  • leixingbang1989
  • leixingbang1989
  • 2016年01月21日 18:34
  • 3814

.net中[Serializable]序列化的应用

浅析.NET中的Serialization   摘要 本文简要介绍了.NET中的序列化(Serialization)概念,以及在代码中实作Serialization的方法。文章的最后介绍了S...
  • wanlong360599336
  • wanlong360599336
  • 2013年07月02日 10:25
  • 4730

Serializable序列化与session

1,关于javabean实现Serializable接口的问题。如果把对象序列化到硬盘,就必须实现这个接口。实现了这个接口的javabean类会有一个默认的类标识,也可以成为类主键。当反序列化的时候,...
  • duchao123duchao
  • duchao123duchao
  • 2015年09月15日 19:53
  • 1806

Serializable序列化List<Modle>

传递List 如果我们要传递的是Object组成的List列表,即List,该怎么办呢?首先需要将Object对象实现Serializable接口,然后把list强制类型转换成Serializabl...
  • afanyusong
  • afanyusong
  • 2015年08月05日 10:09
  • 1414

Android使用序列化接口Parcelable、Serializable

serializable: Parcelable: public class ListInfo implements Parcelable { String name; Strin...
  • qq_30716173
  • qq_30716173
  • 2015年12月27日 22:35
  • 1287

关于序列化对象.Serializable Object总结.

一个对象需要可实现序列化需要满足以下条件. 1.实现Serializable接口 2.父类必须实现可序列化或者存在默认无参构造函数. 3.类的域变量必须实现可序列化或者定义为transient类...
  • rickylin86
  • rickylin86
  • 2015年12月19日 18:56
  • 2162

线程中wait和锁的理解,序列化serializable;

wait进入等待池等待,接受到notify后进入锁池等待,然后会进入runnable; 一个对象被锁了后可以通过在synchronizid里面的对象.wait方法来先释放锁资源,进入等待池等待,然其...
  • name_lemon
  • name_lemon
  • 2017年05月22日 15:41
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Serializable:自定义序列化
举报原因:
原因补充:

(最多只允许输入30个字)