序列化为java开发(文件)交换格式
我想提出一种二进制格式,用于以POF(普通旧文件;)的形式在应用程序实例之间传递数据
先决条件:
- 应该是跨平台的
- 要持久化的信息包括一个POJO&;任意字节[]s(实际上,POJO将其名称存储在字符串[]中)
- 只需要顺序访问
- 应该是检查数据一致性的一种方法
- 应该小而快
- 应防止使用archiver+记事本的普通用户修改数据
目前,我正在使用DeflaterOutputStream+OutputStreamWriter和InflaterInputStream+InputStreamReader来保存/恢复用XStream序列化的对象,每个文件一个对象。读写器使用UTF8。 现在,需要扩展它来支持前面描述的功能。 我对格式的看法:
{serialized to XML object}
{delimiter}
{String file name}{delimiter}{byte[] file data}
{delimiter}
{another String file name}{delimiter}{another byte[] file data}
...
{delimiter}
{delimiter}
{MD5 hash for the entire file}
- 这看起来正常吗李>
- 您将使用什么作为分隔符,以及如何确定它李>
- 在这种情况下,计算MD5的正确方法是什么李>
- 关于这个话题,你有什么建议李>
蒂娅
# 1 楼答案
我同意这一点,因为听起来你并不需要一种新的格式,或者二进制格式。 如果你真的想要二进制格式,为什么不考虑其中的一个:
但除此之外,许多文本格式也应该工作得很好(或者更好);更容易调试,广泛的工具支持,压缩到与二进制文件大致相同的大小(二进制文件压缩效果很差,信息论表明,对于相同的有效信息,可以获得相同的压缩率——在我的测试中也是如此)
因此,或许还可以考虑:
所以听起来你只是想建立自己的东西。没有什么错,作为一种爱好,但如果是这样的话,你需要考虑它。 这可能不是您正在构建的系统的要求
# 2 楼答案
你可以用拉链(rar/7z/tar.gz/…)图书馆很多都存在,大多数都经过了很好的测试,这可能会为你节省一些时间
但可能没那么有趣
# 3 楼答案
模型的序列化(如果你喜欢MVC)不是另一种方式吗?如果可能的话,我宁愿使用语言(或标准库)中的东西,也不愿使用自己的。我能看到的唯一问题是,文件大小可能比您想要的大
# 4 楼答案
1)这看起来正常吗
看起来相当理智。然而,如果你打算发明自己的格式,而不是仅仅使用Java serialization,那么你应该有一个很好的理由。你有什么好的理由吗(在某些情况下确实存在)?使用XStream的标准原因之一是使结果具有可读性,而二进制格式会立即丢失。你有充分的理由选择二进制格式而不是人类可读的格式吗?参见this question了解人类可读性好(和坏)的原因
把所有东西都放在一个有签名的罐子里不是更容易吗。已经有standard Java libraries和tools来做这件事,你可以得到压缩和验证
2)您将使用什么作为分隔符,以及如何确定它
我会在块之前显式存储每个块的长度,而不是分隔符。它同样简单,并且可以防止在分隔符自动出现时必须跳出它
3)在这种情况下,计算MD5的正确方法是什么
有example code here看起来很合理
4)关于这个主题,你建议读什么
关于连载的问题?我读过关于Java序列化、JSON和XStream序列化的书,所以我了解了它们的优缺点,尤其是人类可读文件的好处。我还将研究一种经典的文件格式,例如来自微软的文件格式,以了解在每个字节都很重要的年代可能做出的设计决策,以及这些决策是如何扩展的。例如:The WAV file format