【问题标题】:Java serialization to stringJava序列化为字符串
【发布时间】:2015-04-11 07:35:53
【问题描述】:

我有以下静态类型Object的声明:

Integer typeId;
//Obtaining typeId
Object containerObject = ContainerObjectFactory.create(typeId);

工厂可以生产不同类型的container objects,例如DateIntegerBigDecimal 等等。

现在,在创建containerObejct 之后,我需要将其序列化为String 类型的对象,并使用休眠将其存储到数据库中。我不会提供对象关系映射,因为它与问题没有直接关系。

好吧,我想做的是根据它的运行时类型序列化containerObject,然后用它被序列化的类型反序列化它。有可能吗?我可以使用xml-serialization 吗?

【问题讨论】:

  • 我会对序列化运行时类型保持警惕。它往往会以你无法想象的方式咬你。在您不小心重命名类或将其移动到另一个包后,您会遇到非常讨厌且难以修复的错误。
  • 我觉得tutorialspoint.com/java/java_serialization.htm在这里比较合适。
  • @bgoldst:他想将其序列化为字符串 - 所以如果他想使用原生 Java 序列化,他必须(比如说)在持久化之前对结果进行 Base64 编码。

标签: java serialization


【解决方案1】:

有很多选择,你的问题很广泛。你可以:

您提到的一个关键特性是对象类型需要嵌入到序列化数据中。本机 Java 序列化将类型嵌入到数据中,因此这是一个不错的选择。然而,这是一把双刃剑,因为这会使数据变得脆弱 - 如果在未来某个时间您更改了完全限定的类名,那么您将无法再反序列化该对象。

另一方面,Gson 不嵌入类型信息,因此您必须同时存储 JSON 和对象类型才能反序列化对象。

XML 和 JSON 的优点是它们是文本格式,因此即使不对其进行反序列化,您也可以用肉眼看到它是什么。然而,Base64 编码的 Java 序列化是一个难以理解的字符块。

【讨论】:

  • 事实上,在右侧的相关列中是指向您所问的同一问题的链接,与此类似:stackoverflow.com/questions/134492/…
  • 完美运行。那谢谢你!!很抱歉,我不能多次为您的帖子投票。
【解决方案2】:

有多种方式,但需要自定义序列化方案,例如:

D|25.01.2015
I|12345
BD|123456.123452436

其中 String 的第一部分表示类型,第二部分表示数据。您甚至可以为此使用一些二进制序列化方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 2021-01-08
    • 2020-02-03
    • 2016-02-01
    • 2020-05-20
    • 1970-01-01
    • 2010-12-10
    • 2018-11-01
    相关资源
    最近更新 更多