如何使序列化类的输出更有效?

时间:2015-01-14 11:50:12

标签: java serialization

我正在序列化一个类(保存类的内容),以便我可以在以后恢复它。 所以我使用ObjectOutputStream类实现了内置的序列化机制,但输出大小非常大。

但我希望使输出比内置序列化方法生成的输出更高效或更小。如何提高输出效率?

我知道,

  

Java支持序列化,这是获取的能力   对象并创建可用于恢复的字节表示   以后的对象。通过使用内部序列化   机制,大多数序列化对象的设置都得到了处理。   Java会将对象的属性转换为字节流,   然后可以保存到文件或通过电线传输。

但我已经这样做了,我需要更有效率的方式。它甚至可能吗?

5 个答案:

答案 0 :(得分:2)

我建议不要使用Java内置序列化。您最好使用序列化库,例如Jackson或其他任何您喜欢的序列库。

现在,关于输出大小,您可以通过使用Java GZIPOutputStream装饰ObjectOutputStream来压缩输出:

OutputStream os = ...; // this is your ObjectOutputStream
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(os);

然后使用gzipOutputStream实例,就好像它是您原来的ObjectOutputStream

请记住,您还应该使用Java的GZIPInputStream来阅读序列化数据:

InputStream is = ...; // this is your actual InputStream
GZIPInputStream gzipInputStream = new GZIPInputStream(is);

然后使用gzipInputStream实例,就好像它是您原来的InputStream

答案 1 :(得分:1)

如果课堂上有东西你不需要保存到文件中使用java关键字:transient并且它不会被序列化。

例如private transient Logger logger = Logger.getLogger();

答案 2 :(得分:1)

为什么不尝试压缩输出文件.. 我找到了这篇文章: http://www.devsumo.com/technotes/2014/03/java-compressed-serialization/

GZIPOutputStream用于压缩输出。

答案 3 :(得分:1)

您可以使用自定义格式序列化您的课程。在这种情况下,我使用二进制格式来减小最终大小,避免使用XML和JSON等文本表示。

示例实现可能如下所示:

public class YourClass
{
  private int field1;
  private byte field2;
  // ...

  public void encode(DataOutput stream) throws IOException
  {
     stream.writeInt(field1);
     stream.writeByte(field2);
  }

  public static YourClass decode(DataInput stream) throws IOException
  {
    YourClass ret = new YourClass();
    ret.field1 = stream.readInt();
    ret.field2 = stream.readByte();
    return ret;
  }
}

encode方法用于将类写入流,decode方法从中读取它。 decode方法是静态的,因此它也可以创建类实例,而不依赖于用户手动执行它。

另请注意,如果您的类将类实例作为成员字段并且您希望保留它们,则还必须对其进行编码,因此如果您包含encodedecode,情况会更好所有可序列化类或属于可序列化类的类的方法。

当然这意味着相当多的工作,因为所有领域都必须手工阅读和编写,但可能是最节省空间的解决方案。

答案 4 :(得分:0)

您可以使用JSONReaderJsonWriter将对象转换为JSON格式,然后将其存储在某处以备将来使用。在这种情况下,您的类不需要实现可序列化的接口。并且在数据库中存储json需要的空间非常少。它变得轻巧