为java开发(文件)交换格式
我想提出一种二进制格式,用于以POF(纯旧文件;)的形式在应用程序实例之间传递数据 先决条件:为java开发(文件)交换格式,java,serialization,binary,format,Java,Serialization,Binary,Format,我想提出一种二进制格式,用于以POF(纯旧文件;)的形式在应用程序实例之间传递数据 先决条件: 应该是跨平台的 要持久化的信息包括单个POJO&任意字节[]s(实际上,POJO将其名称存储在字符串[]中) 只需要顺序访问 应该是检查数据一致性的一种方法 应该小而快 应防止使用archiver+记事本的普通用户修改数据 目前,我正在使用DeflaterOutputStream+OutputStreamWriter和InflaterInputStream+InputStreamReader来保存/恢
{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}
TIA.模型的序列化(如果您进入MVC)不是另一种方式吗?如果可能的话,我更喜欢使用语言(或标准库)中的东西,而不是使用我自己的。我能看到的唯一问题是文件大小可能比您想要的大。您可以使用zip(rar/7z/tar.gz/…)库。很多都存在,大多数都经过了很好的测试,这可能会为您节省一些时间 可能没有那么有趣。1)这看起来正常吗 看起来相当理智。然而,如果你打算发明自己的格式而不是仅仅使用它,那么你应该有一个很好的理由。你有什么好的理由吗(在某些情况下确实存在)?使用XStream的标准原因之一是使结果具有可读性,而二进制格式会立即丢失。您是否有充分的理由使用二进制格式而不是人类可读的格式?查看为什么人类可读性好(和坏) 把所有东西都放在一个有签名的罐子里不是更容易吗。已经有很多方法可以做到这一点,并且提供了压缩和验证 2) 您将使用什么作为分隔符以及如何确定它 我宁愿在块之前显式存储每个块的长度,而不是分隔符。它同样简单,并且防止您在分隔符自动出现时必须跳出它 3) 在这种情况下,计算MD5的正确方法是什么 有一种方法看起来很合理 4) 关于这个问题,你建议读什么 关于连载的问题?我读过关于Java序列化和XStream序列化的书,所以我了解了它们的优缺点,特别是人类可读文件的好处。我还将研究一种经典的文件格式,例如来自微软的文件格式,以了解在每个字节都很重要的年代可能做出的设计决策,以及这些决策是如何扩展的。例如:.可能是一种方法 这是丹尼尔·斯皮瓦克的一篇文章 不幸的是,bencode规范不支持utf8,这对我来说是一个阻碍
稍后可能会谈到这一点,但目前xml似乎是一个更好的选择(将blob序列化为映射)。也许您可以解释一下,这比使用JAR等现有文件格式更好 这种类型的大多数标准文件格式都使用CRC,因为它计算起来更快。如果你想防止故意修改,MD5更合适。它看起来很疯狂
- 为什么要发明一种新的文件格式
- 为什么只阻止愚蠢的用户更改文件
- 为什么使用二进制格式(难以压缩)
- 为什么使用接收时无法解析的格式?(接收方必须先接收整个文件,然后才能对该文件采取行动。)
- XML已经是一种可压缩的序列化格式。因此,您正在序列化序列化格式
- 二进制XML(快速信息集,Bnux)
- 黑森
- 谷歌数据包缓冲区
- Json运行良好;通过base64提供二进制支持(例如,)
- XML也不错;高效的流式解析器,其中一些具有base64支持(,'org.codehaus.stax下的“类型化访问API”)
- 让我们看看这应该是非常简单的
先决条件:
0。应该是跨平台的
一,。要持久化的信息包括单个POJO&任意字节[]s(实际上,POJO将其名称存储在字符串[]中)
二,。只需要顺序访问
三,。应该是检查数据一致性的一种方法
四,。应该小而快
五,。应防止使用archiver+记事本的普通用户修改数据
猜猜看,你几乎已经拥有了它,它已经内置在平台中:
如果您需要减少在连接中发送的数据量并提供自定义序列化(例如,对于给定对象,您可以只发送1,2,3,而不使用属性名称或任何类似的名称,并以相同的顺序读取它们),您可以以某种方式使用它
如果你真的需要它在“纯文本”中,你也可以对它进行编码,它需要的字节数几乎相同
例如,这个bean:
import java.io.*;
public class SimpleBean implements Serializable {
private String website = "http://stackoverflow.com";
public String toString() {
return website;
}
}
可以这样表示:
rO0ABXNyAApTaW1wbGVCZWFuPB4W2ZRCqRICAAFMAAd3ZWJzaXRldAASTGphdmEvbGFuZy9TdHJpbmc7eHB0ABhodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20=
此外,如果您需要一个声音协议,您也可以查看Google的内部交换格式。我同意,听起来您并不需要新的格式或二进制格式。 如果你真的想要二进制格式,为什么不考虑其中的一个: