我正在经历blog并且有一个问题出现在我脑海中。是否有可能覆盖ObjectOutputStream的写入方式。
假设我正在写一个文件out.dat,即
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat")));
out.writeObject(o);
当我在Notepad ++中打开文件out.dat时,我看到了二进制数据。这是有道理的。如果,我想自定义这些数据的编写方式。让我说我想要我的out.dat文件以JSON格式(这只是一个例子,它可以是任何其他格式)。我应该用什么方法来覆盖?
答案 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框架以字符串格式提供一个实例的数据,反之亦然,那么不应该太难。