2011-09-14 48 views
1

我正在阅读blog,有一个问题来到我的头上。是否有可能覆盖ObjectOutputStream的写法。自定义Java序列化

比方说,我写一个文件out.dat即

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

当我在记事本打开该文件out.dat ++,我看到了二进制数据。这是有道理的。如果我想定制这些数据写入的方式,该怎么办?比方说,我想我的out.dat文件在JSON格式(这只是一个例子,它可以是任何其他格式)。我应该覆盖什么方法来做到这一点?

回答

0

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

public interface IJSONSerializable{ 
    public String getSerializedForm(); 
} 

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

其他的想法

如果你选择走这条路,你可以写一个辅助类写出来的东西,如一个属性和一个值。

1

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

+0

他为什么不应该这样做?这不是最有效的转换(但是既不是默认的java序列化),但它经常在Web上使用,而不会造成太大的问题。只要他做得对,数据在传输时看起来像什么样子是相当无趣的。 – Voo

0

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

所以对于要在JSON格式序列化任何类只是简单地覆盖

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

应该不会太硬,如果有一些JSON框架在那里,让你在字符串格式和副一个实例的数据反之亦然。

1

你可以让你的对象实现Externalizable并完全控制序列化。使用例如当执行readExternal/writeExternal方法时,JSON为google-gson

1

在您的情况,您正在寻找一个自定义序列化机制,我会建议您实现Externalizable接口,并提供了方法的实现

public void writeExternal(ObjectOutput out) throws IOException

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

它完全取决于你在这种情况下你想如何序列化。