繁体   English   中英

从具有向后兼容性的可序列化对象中提取Java超类

[英]Extract java superclass from serializable object with backwards compatibility

我想将类功能移到父类,但这会阻止反序列化。 起点是这样的:

package xso.test.serializable;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class WriteClass
{
  public static void main( String[] args ) throws Exception
  {
    MyClass d = new MyClass();
    d.i = 888;

    try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "MyClass.ser" ) ))
    {
      System.out.println( "Serializing" );
      oos.writeObject( d );
    }
  }
}

class MyClass implements Serializable
{
  /**
   * same serialVersionID as in ReadClassNew
   */
  private static final long serialVersionUID = -4436695035358861227L;

  int i = 10;
}

我想像这样将MyClass提取到新的SuperClass(MyNewParentClass):

package xso.test.serializable;

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class ReadClassNew
{
  public static void main( String[] args ) throws Exception
  {
    ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "MyClass.ser" ) );
    System.out.println( "Deserializing" );
    MyClass clazz = (MyClass)ois.readObject();
    System.out.println( clazz.i );
  }
}

class MyNewParentClass implements Serializable
{
  /**
   * 
   */
  private static final long serialVersionUID = -6437613570659781444L;

  int i = 10;
}

class MyClass extends MyNewParentClass
{
  /**
   * same serialVersionID as in WriteClass
   */
  private static final long serialVersionUID = -4436695035358861227L;

  //int i = 10; // moved to parent class. (Field will not serialized any more sadly )
}

要查看并重现该问题:

  1. 运行第一个代码段。
  2. 运行第二个代码段。 控制台输出将是:

      Deserializing 0 

如果您取消注释int i = 10; 在子类(MyClass)中,您可以看到反序列化可以正常工作。 不过,我想反序列化领域的int i的超类。

这可能吗? 感谢您的任何建议。

我想在EJP的评论中添加一些内容

当对象被序列化时,其整个对象图将被序列化。 这意味着被序列化对象的实例变量引用的任何对象都将被序列化,并且那些对象所引用的任何对象...等等。 在您的情况下,代码的第一个class MyNewParentClass class MyClass class MyNewParentClass及其变量,因此基本上这两个指向堆上不同的内存字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM