首页 > Java开发 > java对象序列化与静态变量及transient

java对象序列化与静态变量及transient

序列化是将对象状态转换为可保持或传输的格式的过程,它也是RMI用来在不同JVM之间传递对象的机制,或者通过方法的参数或者作为一个方法调用的返回值。但有三个例外序列化不需要读或者写入到流:

1. 序列化会忽略静态字段,因为他们不属于对象的任何状态。

2. 基类的字段只有基类本身是序列化的时候才能被序列化。

3. 瞬间字段(transient)

 

 

 

我在写对象序列化时遇到了一点疑问,

代码如下.

[java][/java] view plaincopy

  1. import java.io.*;
  2. class Demo
  3. {
  4.     public static void main(String[] args)   throws Exception
  5.     {
  6.         //writeObj();
  7.         readObj();
  8.     }
  9.     public static void writeObj()  throws IOException
  10.     {
  11.         ObjectOutputStream oos =
  12.             new ObjectOutputStream(new FileOutputStream("obj.txt"));
  13.         Person p = new Person("zhangsan",22,"kr");
  14.         oos.writeObject(p);
  15.         oos.close();
  16.     }
  17.     public static void readObj()  throws Exception
  18.     {
  19.         ObjectInputStream ois =
  20.             new ObjectInputStream(new FileInputStream("obj.txt"));
  21.             //如果Person类在存储后发生了变化 再去依据变化后的类去读取以前的会发生异常
  22.             /*
  23.             Exception in thread "main" java.io.InvalidClassException: Person; local class in
  24.             compatible: stream classdesc serialVersionUID = 4485381321937480966, local class
  25.             serialVersionUID = 4491012183083119912
  26.             */
  27.              Person p = (Person)(ois.readObject());
  28.             sop(p.toString());
  29.     }
  30.     public static void  sop(Object obj)
  31.     {
  32.         System.out.println(obj);
  33.     }
  34. }

 

person.java

 

[java][/java] view plaincopy

  1. import java.io.*;
  2. class Person implements Serializable
  3. {
  4.     private String name;
  5.     private transient int  age;
  6.     static String country = "cn";
  7.     Person(String name,int age,String country)
  8.     {
  9.         this.name = name;
  10.         this.age = age;
  11.         this.country = country;
  12.     }
  13.     public String toString()
  14.     {
  15.         return name+":"+age+":"+country;
  16.     }
  17. }

我发现当我分别在main中read()和write()时得到了我想要的结果(前者)

 

当我在main中同时使用read()和wirte()时 发现静态变量居然变了.

 

 

然后我就看了一下存储的文件,虽说是乱码,但也有点端倪.

 

 

原因如下:
1  只有堆内存会被序列化.所以静态变量会天生不会被序列化.
2   不会被序列化的变量,不会被写入流中.
3 静态变量在全局区,本来流里面就没有写入静态变量,我打印静态变量当然会去全局区查找,当我write read 同时使用时,内存中的静态变量变了,所以打印出来的也变了.
4 而transient修饰的局部变量不一样,它也同样没写入,所以read出来的对象中它没有值,所以就被默认初始化了

本文固定链接: http://www.devba.com/index.php/archives/2684.html | 开发吧

报歉!评论已关闭.