如何在不实现Serializable接口的情况下序列化/反序列化对象?

时间:2013-01-03 07:19:49

标签: java serialization

如果邮件发送到我的收件箱,我会收到一条消息,然后我将内容插入到数据库中。 我有一个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序列化为File?

3 个答案:

答案 0 :(得分:5)

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

  • XML
  • JS​​ON
  • BSON
  • MessagePack
  • protobufs
  • ...

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

有一些java库可以处理上述所有格式:JAXB(XML),Jackson(JSON)等。

答案 1 :(得分:1)

  

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

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

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

答案 2 :(得分:-1)

我不知道我是否理解它是正确的..但假设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();