我正在序列化一个类(保存类的内容),以便我可以在以后恢复它。
所以我使用ObjectOutputStream
类实现了内置的序列化机制,但输出大小非常大。
但我希望使输出比内置序列化方法生成的输出更高效或更小。如何提高输出效率?
我知道,
Java支持序列化,这是获取的能力 对象并创建可用于恢复的字节表示 以后的对象。通过使用内部序列化 机制,大多数序列化对象的设置都得到了处理。 Java会将对象的属性转换为字节流, 然后可以保存到文件或通过电线传输。
但我已经这样做了,我需要更有效率的方式。它甚至可能吗?
答案 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
方法是静态的,因此它也可以创建类实例,而不依赖于用户手动执行它。
另请注意,如果您的类将类实例作为成员字段并且您希望保留它们,则还必须对其进行编码,因此如果您包含encode
和decode
,情况会更好所有可序列化类或属于可序列化类的类的方法。
当然这意味着相当多的工作,因为所有领域都必须手工阅读和编写,但可能是最节省空间的解决方案。
答案 4 :(得分:0)
您可以使用JSONReader和JsonWriter将对象转换为JSON格式,然后将其存储在某处以备将来使用。在这种情况下,您的类不需要实现可序列化的接口。并且在数据库中存储json需要的空间非常少。它变得轻巧