定制Java序列化

定制Java序列化,java,serialization,object,customization,Java,Serialization,Object,Customization,我正经历一场灾难,一个问题浮现在我的脑海里。是否可以覆盖ObjectOutputStream的写入方式 假设我正在写入out.dat文件,即 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\out.dat"))); out.writeObject(o); 当我在Notepad++中打开out.dat文件时,我看到了二进制数据。这是有道理的。如果,我想自定义写入数据的方式,该怎么

我正经历一场灾难,一个问题浮现在我的脑海里。是否可以覆盖ObjectOutputStream的写入方式

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

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

当我在Notepad++中打开out.dat文件时,我看到了二进制数据。这是有道理的。如果,我想自定义写入数据的方式,该怎么办。假设我想要JSON格式的out.dat文件(这只是一个示例,它可以是任何其他格式)。我应该重写什么方法来实现这一点?

我很确定java内部不支持序列化为JSON。在我看来,您最好的选择是为获取JSON创建一个接口,并让您想要序列化的任何对象实现此接口:

public interface IJSONSerializable{
    public String getSerializedForm();
}
然后使用基本的
FileOutputStream
进行输出,因为(据我所知,
ObjectOutputStream
用于将对象序列化为二进制,并且不支持JSON

其他想法


如果您选择这种方式,您可以编写一个helper类来写出属性和值等内容。

我很确定java内部不支持序列化为JSON。在我看来,您最好的选择是为获取JSON创建一个接口,并让您想要序列化的任何对象实现此接口:

public interface IJSONSerializable{
    public String getSerializedForm();
}
然后使用基本的
FileOutputStream
进行输出,因为(据我所知,
ObjectOutputStream
用于将对象序列化为二进制,并且不支持JSON

其他想法


如果您选择这种方式,您可以编写一个helper类来写出诸如属性和值之类的内容。

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

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

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

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

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

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

Java本身没有内置的JSON序列化支持,但我相信您可以找到这样的框架,或者自己编写简单的类

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

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

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

您可以实现您的对象并完全控制序列化。例如,在实现
readExternal
/
writeExternal
方法时使用JSON。

您可以使对象实现并完全控制序列化。例如,在实现
readExternal
/
writeExternal
方法时使用JSON。

通过实现Externalizable并重写writeExternal和readExternal方法,您可以做您想做的事情。有关详细信息,请参阅


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

通过实现Externalizable并重写writeExternal和readExternal方法,您可以做您想要做的事情。有关详细信息,请参阅


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

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

public void writeExternal(ObjectOutput out)抛出IOException

public void readExternal(ObjectInput in)抛出IOException、ClassNotFoundException


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

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

public void writeExternal(ObjectOutput out)抛出IOException

public void readExternal(ObjectInput in)抛出IOException、ClassNotFoundException


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

他为什么不这样做?它不是最有效的传输(但是默认的java序列化也不是),但是它在web上使用的频率足够高,没有太大的问题。只要他做得正确,数据在传输时的样子就很无趣。他为什么不做呢?它不是最有效的传输(但是默认的java序列化也不是),但是它在web上使用的频率足够高,没有太大的问题。只要他做得正确,数据在传输时的样子就很无趣。