当前位置: 首页 > 面试题库 >

如果将对象移动到另一个程序包或重命名了,该如何反序列化该对象?

郭单鹗
2023-03-14
问题内容

请考虑以下情况:

有一个由应用程序的较早版本创建的序列化文件。不幸的是,该软件包已针对已序列化的类进行了更改。现在,我需要将该文件中的信息加载到相同的类中,但位于不同的包中。此类已serialVersionUID定义且未更改(即兼容)。

问:是否可以使用任何技巧从该文件中加载新的类实例(将琐碎的类复制到旧包中,然后使用反序列化包装器逻辑除外)?是否可以使用readResolve()从上课/重新上课中恢复过来?如果没有,请解释原因。


问题答案:

有可能的:

class HackedObjectInputStream extends ObjectInputStream {

    public HackedObjectInputStream(InputStream in) throws IOException {
        super(in);
    }

    @Override
    protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
        ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();

        if (resultClassDescriptor.getName().equals("oldpackage.Clazz"))
            resultClassDescriptor = ObjectStreamClass.lookup(newpackage.Clazz.class);

        return resultClassDescriptor;
    }
}

如果更改了其字段结构,这也可以使它忽略serialVersionUID不匹配,甚至反序列化一个类。



 类似资料:
  • 有没有办法将一般对象序列化为Json并将Json反序列化为对象<如果对象是一个实体,我可以使用Jackson 2库来实现这个目的<但是如果对象是一个普通类,我该怎么做呢? 例如,我想序列化com.datastax.driver.core.querybuilder。将更新为Json并保存到DB,然后搜索并反序列化它以更新对象,最后将其用作com.datastax.driver.core.Sessio

  • 问题内容: 我只想要对象的第一个深度级别(我不需要任何子级)。我愿意使用任何可用的图书馆。大多数库仅在达到递归深度时才会抛出异常,而不仅仅是忽略。如果这不可能,是否有一种方法可以忽略给定特定数据类型的特定成员的序列化? 编辑:假设我有一个像这样的对象: 我想删除任何子级(甚至是复杂类型)以返回这样的对象: 问题答案: 在Json.NET中,可以使用和序列化程序之间的一些协调。 自定义在对象启动时增

  • 问题内容: 我很高兴使用Newtonsoft JSON库。例如,我将从.NET对象创建一个,在这种情况下为Exception的实例(可能是子类,也可能不是子类) 现在我知道该库可以将JSON文本(即字符串)反序列化为对象 但我正在寻找的是: 显然,我可以从头回到JSON文本,然后使用反序列化功能,但这对我来说似乎是倒退的。 问题答案: 根据这篇文章,现在好多了: 文档: 将JSON转换为类型

  • 问题内容: 在C#中,我已经通过使用如下代码成功将匿名对象序列化为JSON … 但是,我以后想要做的是将JSON字符串反序列化为一个匿名对象。像这样 但是serializer.Deserialize()方法需要第二个参数,该参数是将反序列化到的对象的类型。 我试过了 但这会产生错误: 没有为’<> f__AnonymousType0`2 [[System.Int32,mscorlib,Versio

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co

  • 嗨,我有LogEventObject在客户端用于记录事件,我想使用REST API将其发送到服务器。我将LogEventObject转换为json字符串,并通过REST将其作为有效载荷发送。在服务器端,我使用Groovy,当我尝试做对象apper.read值()时,我得到以下错误。 com.fasterxml.jackson.databind.JsonMappingExc0019:找不到非具体的集