A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马良 中级黑马   /  2012-11-24 08:43  /  1473 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天又看了一遍老师讲的对象的序列化的问题,还是没能搞的很明白。
1、对象的序列化有什么作用。(能用一个简单的例子讲一下吗?)
2、给类加了一个固定标识:public static final long serialVersionUID=42L后,原来呗序列化的对象还可以被新的类操作吗?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
回答:
       1.对象序列化可以将对象存储在硬设备(磁盘)上,或者可以让对象通过网络传输该对象。这个技术是javaEE分布式操作的基础。
       2.java序列化机制采用了一种特殊的算法:所有保存在磁盘的对象都有一个序列化编号,当程序试图序列化一个对象时,会先检查该对象是否已经被序列化,只有当该      对象没有被序列化过,才会序列化该对象。这样保证了每个对象的唯一性。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
王震阳 发表于 2012-11-24 08:54
回答:
       1.对象序列化可以将对象存储在硬设备(磁盘)上,或者可以让对象通过网络传输该对象。这个技 ...

童鞋,你太牛了!!
再请教一下,你说的存在磁盘上的对象都有一个序列化编号,那想问一下是不是每个对象都有自己特有的序列化编号呢?这个编号跟类中定义的标识有什么关系呢?
假如是按你说的每个对象都有不同的序列化编号:就比如:Person类创建了两个不同的对象,p1,p2,  那么在用ObjectInputStream/ObjectOutputStream操作这两个对象的时候,Person类如何识别p1,p2就是它的对象呢?
回复 使用道具 举报
马良 发表于 2012-11-24 09:10
童鞋,你太牛了!!
再请教一下,你说的存在磁盘上的对象都有一个序列化编号,那想问一下是不是每个对象 ...

你一共问了三个问题:
        回答问题前,你必须要把类和对象区分开,一个类比如Person类,可以new 很多个对象。类的标识符跟对象的序列化编号没有任何关系,标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
       每个对象都有唯一的序列化编号,这是肯定的。就算两个对象同属于一个类new出来的(比如Person p1=new Person();Person p2=new Person()),那么p1和p2是两个对象,他们的序列化编号是不同的。
回复 使用道具 举报
王震阳 发表于 2012-11-24 09:48
你一共问了三个问题:
        回答问题前,你必须要把类和对象区分开,一个类比如Person类,可以new 很 ...

非常感谢你,虽然有些点还不是很明白,但是你已经解决了大部分吧的疑惑了
回复 使用道具 举报
1、对象序列化就是把一个对象变为二进制的数据流的一种方法。通过对象序列化可以方便地实现对象的传输或存储。
   如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口,此接口定义如下:
    public interface Serializable{}
  例如:
import java.io.Serializable;
  public class Person implements Serializable{           //此类的对象可以被序列化
         private  String name;                                    //声明name属性
      private  int age;                                           //声明age属性
      public Person(String name, int age){              //通过构造方法设置属性内容
                this.name = name;
                this.age = age;
      }
          public String toString(){                   //覆写toString()方法
                 return "姓名:"+this.name+";年龄:"+this.age;
       }
}
以上的Person类已经实现了序列化接口。

(2)public static final long serialVersionUID=42L这反映了对象序列化和对象反序列化操作时的版本兼容性问题:
在对象进行序列化或反序列化时,要考虑JDK版本的问题,如果版本不一致会造成异常,所以在序列化操作中引入了一个serialVersionUID的常量。当实现java.io.Serializable接口的实体没有显示地定义一个名为serialVersionUID、类型为long的变量时java在编译时会自动生成serialVersionUID,也可以直接显示地定义一个名为serialVersionUID、类型为long的变量、只要不修改这个变量值的序列化实体皆可以。
    在上面代码中直接在Person中加入以下常量即可:
    public static final long serialVersionUID=42L;
    serialVersionUID的具体内容由用户指定。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马