首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从具有向后兼容性的可序列化对象中提取java超类

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

Stack Overflow用户
提问于 2018-03-22 15:42:36
回答 1查看 89关注 0票数 0

我想将类功能移到父类,但这将抑制反序列化。起点是:

代码语言:javascript
复制
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)中,如下所示:

代码语言:javascript
复制
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. 运行第二个代码段。控制台输出将是: 反序列化0

如果取消子类( int i = 10; )中的注释,则可以看到反序列化可以工作。但是我想反序列化超类中的字段int i

这个是可能的吗?谢谢你的建议。

EN

回答 1

Stack Overflow用户

发布于 2018-03-22 16:36:00

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

当一个对象被序列化时,它的整个对象图被序列化。这意味着序列化对象的实例变量引用的任何对象都是序列化的,而那些objects...and引用的任何对象都是序列化的。在您的示例中,来自第一个代码片段的class MyClass不了解class MyNewParentClass及其变量,因此这两个基本上指向堆上不同的内存字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49432857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档