`
laies
  • 浏览: 242917 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Serializable序列化分析

    博客分类:
  • Java
XML 
阅读更多
1、实现Serializable回导致发布的API难以更改,并且使得package-private
   和private这两个本来封装的较好的咚咚也不能得到保障了
2、Serializable会为每个类生成一个序列号,生成依据是类名、类实现的接口名、
   public和protected方法,所以只要你一不小心改了一个已经publish的API,
   并且没有自己定义一个long类型的叫做serialVersionUID的field,哪怕只是添加
   一个getXX,就会让你读原来的序列化到文件中的东西读不出来(不知道为什么要把方法名
   算进去?)
3、不用构造函数用Serializable就可以构造对象,看起来不大合理,这被称为
   extralinguistic mechanism,所以当实现Serializable时应该注意维持构造函数
   中所维持的那些不变状态
4、增加了发布新版本的类时的测试负担
5、1.4版本后,JavaBeans的持久化采用基于XML的机制,不再需要Serializable
6、设计用来被继承的类时,尽量不实现Serializable,用来被继承的interface
   也不要继承Serializable。但是如果父类不实现Serializable接口,子类很难实现它,
   特别是对于父类没有可以访问的不含参数的构造函数的时候。所以,一旦你决定不实现
   Serializable接口并且类被用来继承的时候记得提供一个无参数的构造函数.
7、内部类还是不要实现Serializable好了,除非是static的,(偶也觉得内部类不适合
   用来干这类活的)
8、使用一个自定义的序列化方法
   看看下面这个保存一个双向链表的例子:



public class StringList implements Serializable
{
private int size = 0;
private Entry head = null;

private static class Entry implements Serializable
{
  String data;
   Entry next;
   Entry previous;
}
...//Remainder ommitted
}
这样会导致链表的每个元素以及元素之间的关系(双向链表之间的连接)
都保存下来,更好的方法是提供一个自定义的序列化如下:
//String List with a resonable custom serialized form

class StringList implements Serializable
{
  private transient int size = 0;        //!transient
  private transient Entry head = null;   //!transient
  
   //no longer serializable!
  private static class Entry
   {
     String data;
     Entry next;
     Entry previous;
   }
  
   //Appends the specified string to the list
  public void add(String s) {/*...*/};
  
   /**
    * Serialize this StringList instance
    * @author yuchifang
    * @serialData The size of the list (the number of strings
    * it contains) is emitted(int), in the proper sequence
    */
  private void writeObject(ObjectOutputStream s)
               throws IOException
   {
     s.defaultWriteObject();
     s.writeInt(size);
     //Write out all elements in the proper order
    for (Entry e = head; e != null; e = e.next)
       s.writeObject(e.data);
   }
  
  private void readObject(ObjectInputStream s)
               throws IOException, ClassNotFoundException
   {
    int numElements = s.readInt();
    
     //Read in all elements andd insert them in list
    for (int i = 0; i < numElements; i++)
       add((String)s.readObject());
   }
   //...remainder omitted
}
   UID:private static final long serialVersionUID = randomLongValue;
10、不需要序列化的东西使用transient注掉它吧,别什么都留着。
11、writeObject/readObject重载以完成更好的序列化readResolve
   与 writeReplace重载以完成更好的维护invariant controllers

9、不管你选择什么序列化形式,声明一个显式的
分享到:
评论
1 楼 blowfisher 2007-09-19  
很多时候,需要序列化的是值对象 所以很多问题并不是大问题

相关推荐

    java serializable 序列化与反序列化

    `Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,它的实例就可以被序列化。 **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换...

    java.io.Serializable序列化问题

    ### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    析Android中的Serializable序列化.rar_Serializable _android

    本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意事项。 一、Serializable接口概述 Serializable接口是Java提供的一种序列化机制,它允许对象的状态被转换成字节流,以便于存储或者...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    Serializable序列化

    **Serializable序列化** 在Java编程语言中,`Serializable`接口是一个非常重要的概念,它涉及到对象的状态持久化和网络传输。序列化是将一个对象转换为字节流的过程,这样就可以将其保存到磁盘、数据库或者在网络中...

    Java_Serializable(序列化)的理解和总结

    ### Java Serializable(序列化)的理解和总结 #### 一、序列化的定义与目的 序列化是一种将对象的状态转换为可以存储或传输的形式的过程。在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被...

    序列化 serializable demo

    首先,`Serializable`接口是Java中用于实现序列化的标志接口。它没有定义任何方法,但当一个类实现了这个接口,Java的ObjectOutputStream就可以将该类的对象写入到流中。例如,`MySerializable.java`和`Product.java...

    Android序列化——Serializable与Parcelable

    本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...

    javascript实现序列化serializable unserializable

    在JavaScript中,序列化(Serialization)和反序列化(Unserialization)是两个关键概念,用于将数据对象转换为可传输的字符串格式,以及将这种字符串还原回原始对象。这一过程在许多场景下都非常有用,例如在存储...

    可序列化接口Serializable

    在Java类定义中,只需添加`implements Serializable`即可实现序列化。例如: ```java public class MyClass implements Serializable { private int id; private String name; // ... } ``` **序列化标识符:...

    序列化类的作用Serializable

    如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,但是父类的字段不会被序列化,除非父类中声明了`transient`或`volatile`的字段。 在序列化过程中,有时需要对特定类的字段进行特殊处理。...

    java序列化和反序列化的方法

    在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...

    java 对象的序列化与反序列化

    要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,没有包含任何方法,只是表明该类的对象是可以被序列化的。 下面是一些关于序列化的重要知识点: 1. **序列化标识符...

    C#和Java的序列化反序列化

    而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...

    hessian学习基础篇——序列化和反序列化

    在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续使用或在网络上传输。 Hessian,由Caucho Technology开发,是一种二进制的序列化格式。相比...

    Serializable在C#中的作用.NET 中的对象序列化

    ### C#中Serializable的作用与对象序列化详解 #### 一、引言 在现代软件开发中,特别是基于.NET框架的应用程序开发中,对象序列化是一项非常重要的技术。它允许将对象的状态转换为一种持久的形式(如文件或网络传输...

    Java序列化(Serializable)与反序列化__1.docx

    Java序列化(Serializable)是Java平台提供的一种持久化机制,允许将对象的状态转换为字节流,以便存储到磁盘、数据库中,或者在网络上传输。这一过程被称为对象的序列化。反之,将字节流恢复为原来的对象状态称为反...

    Java序列化(Serializable)与反序列化_.docx

    ### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...

Global site tag (gtag.js) - Google Analytics