自定义Java序列化

时间:2011-09-14 19:15:20

标签: java serialization object customization

我正在经历blog并且有一个问题出现在我脑海中。是否有可能覆盖ObjectOutputStream的写入方式。

假设我正在写一个文件out.dat,即

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat")));
out.writeObject(o);

当我在Notepad ++中打开文件out.dat时,我看到了二进制数据。这是有道理的。如果,我想自定义这些数据的编写方式。让我说我想要我的out.dat文件以JSON格式(这只是一个例子,它可以是任何其他格式)。我应该用什么方法来覆盖?

6 个答案:

答案 0 :(得分:1)

我认为你不应该这样做,因为这种格式用于保持层之间的通信(使用网络上的分布式对象)。你可以做的只是创建一个处理程序,使用漂亮的格式将对象存储在一个文件中。

答案 1 :(得分:1)

您可以使对象实现Externalizable并完全控制序列化。使用例如google-gson用于实施readExternal / writeExternal方法时的JSON。

答案 2 :(得分:1)

通过实现Externalizable并覆盖writeExternal和readExternal方法,您将能够执行所需的操作。有关详细信息,请参阅http://download.oracle.com/javase/7/docs/platform/serialization/spec/output.html#3146

请注意,它将允许自定义一个对象的序列化输出,但不能自定义整个流的格式。因此,您将在其他二进制数据中找到您的JSON字符串。

答案 3 :(得分:1)

在您的场景中,您正在寻找自定义序列化机制,我建议您实现Externalizable接口并提供方法的实现

public void writeExternal(ObjectOutput out) throws IOException

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

在这种情况下,完全由您决定如何序列化。

答案 4 :(得分:0)

我很确定java没有内部支持序列化为JSON。在我看来,最好的办法是创建一个获取JSON的接口,并让你想要序列化为JSON的任何对象实现这个接口:

public interface IJSONSerializable{
    public String getSerializedForm();
}

然后使用基本FileOutputStream输出,因为(据我所知)ObjectOutputStream用于将对象序列化为二进制,并且没有对JSON的固有支持。

其他想法

如果您选择这样做,您可以编写一个帮助类来写出属性和值等内容。

答案 5 :(得分:0)

Java本身没有内置的JSON序列化支持,但是我确信你可以找到那样做的框架 - 或者只是为简单的类自己编写。

因此,对于要以JSON格式序列化的任何类,只需覆盖

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

如果有一些JSON框架以字符串格式提供一个实例的数据,反之亦然,那么不应该太难。