【问题标题】:How to Serialize/Deserialize an object without implementing Serializable interface?如何在不实现 Serializable 接口的情况下序列化/反序列化对象?
【发布时间】:2013-01-03 07:19:49
【问题描述】:

如果邮件发送到我的收件箱,我会收到一条消息,然后我会将内容插入 DB。 我有一个 org.springframework.integration.core.Message 如下所示:

public void receive(Message<?> message)
{
    //I am inserting message contents into DB
}

现在万一发生故障,我想有故障安全恢复机制,我的想法是将 Message 对象序列化为文件,然后反序列化并更新到 DB。

问题 1.这种情况下如何序列化Message对象? 2. 除了序列化还有什么其他的机制可以使用吗?

编辑 我之前没有做过序列化,听说类应该实现Serializable才能使用ObjectOutputStream,这种情况下我不想创建Message的子类,那么如何将Message序列化为文件?

【问题讨论】:

  • 您可以将消息内容写入文件,然后再读取。
  • 如何在没有子类化消息并实现可序列化的情况下做到这一点?
  • 为此您必须手动实现序列化。例如,如果您的消息 obj 有一个名为 sender: 的属性,那么您可以在文本文件中将其写为 $sender: "name" 并在回读时创建一个新的消息对象,读取保存的文件,解析其 $sender 并分配将其添加到您创建的消息对象中。
  • 但是是的,解析将是另一个令人头疼的问题。

标签: java serialization


【解决方案1】:

当然,除了 jvm 之外,还有很多序列化机制。

  • XML
  • JSON
  • BSON
  • 消息包
  • protobufs
  • ...

其中一些是基于文本的,一些是二进制的。都有缺点和优点。基于文本的可读性强,二进制的速度更快,占用空间更少。

有处理上述所有格式的 java 库:JAXB (XML)、Jackson (JSON) 等。

【讨论】:

    【解决方案2】:

    在这种情况下如何序列化Message对象?除了序列化还有什么其他的机制可以使用吗?

    从消息中提取您需要的所有数据并保存。您可以选择任何方式执行此操作。

    您可以通过使用您保存的数据填充新消息来反序列化它。

    【讨论】:

      【解决方案3】:

      我不知道我是否理解它好吧..但假设 Message 只不过是大量字符串和一些整数,您可以直接使用 ObjectOutputStream 并将其写入文件(二进制)然后读取之后。为什么不呢?

      Message e = new Message();
      ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("whatever");
      oos.writeObject(message);
      
      // read in
      ObjectInputStream ois = new ObjectInputStream(new FileInputStream("whatever");
      Message e = (Message) ois.readObject();
      

      【讨论】:

      • -ve String 实现了可序列化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2010-09-15
      相关资源
      最近更新 更多