2009-02-19 65 views
0

我想提出一种二进制格式,用于在POF(普通旧文件;)形式的应用程序实例之间传递数据。为java开发(文件)交换格式

先决条件:

  1. 应该是跨平台的
  2. 信息被保留包括一个POJO &任意字节[] S(文件实际上,该POJO并将其存储的名字在一个String [])
  3. 仅顺序访问需要
  4. 应该检查数据一致性
  5. 应该是小而快的方式
  6. 应防止与归档+记事本的平均用户修改数据

目前我使用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} 
  1. 这是否看起来理智?
  2. 您将如何使用分隔符以及如何确定它?
  3. 在这种情况下计算MD5的正确方法是什么?
  4. 你会建议阅读这个主题?

TIA。

+0

我不会使用字节,因为http://c2.com/cgi/wiki?PowerOfPlainText – keuleJ 2011-02-02 18:21:20

回答

3

它看起来INsane。

  • 为什么要发明一种新的文件格式?
  • 为什么试图阻止只有愚蠢的用户更改文件?
  • 为什么使用二进制格式(难以压缩)?
  • 为什么使用无法在接收时解析的格式? (接收器必须接收整个文件才能对文件执行操作)
  • XML已经是可压缩的序列化格式。所以你正在序列化一个序列化的格式。
2

模型的序列化(如果你是MVC)不是另一种方式吗?我更喜欢用语言(或标准库)中的东西,而不是在可能的情况下推出我自己的东西。我能看到的唯一问题是文件大小可能比你想要的大。

+0

编辑添加跨平台。 – yanchenko 2009-02-21 02:57:26

+0

当你说“跨平台”时,你是指跨语言吗?只要您坚持使用Java,Java序列化就是跨平台的。 – TofuBeer 2009-02-21 21:45:24

1

您可以使用zip(rar/7z/tar.gz/...)库。许多存在,大多数都经过了充分测试,它可能会为你节省一些时间。

虽然可能不那么有趣。

+0

没有乐趣:) – yanchenko 2009-02-20 09:00:35

+0

Java有自己的压缩文件格式,称为jar。 ;) – 2009-02-20 21:01:14

+0

是的,它也支持zip&tar.gz;顺便说一句,如果你想看恐怖片,看看7z sdk的实现方式:D – yanchenko 2009-02-21 03:00:18

2

1)这看起来是否理智?

看起来相当理智。但是,如果你打算发明自己的格式,而不是仅仅使用Java serialization,那么你应该有一个很好的理由。你有没有什么好的理由(在某些情况下确实存在)?使用XStream的一个标准原因是让结果变得可读,二进制格式立即丢失。您是否有充分的理由使用二进制格式而不是人类可读的格式?请参阅this question为什么人类可读性好(坏)。

只是把所有东西都放在签名的jar里,这样做更容易吗?已经有standard Java librariestools这样做,并且您可以获得压缩和验证。

2)你会用什么分隔符来判断它?

而不是一个分隔符我会明确地存储块之前的每个块的长度。这很简单,如果它自己出现,就可以避免你必须避开分隔符。

3)在这种情况下计算MD5的正确方法是?

example code here看起来合理。

4)您对该主题有何建议?

关于序列化的问题?我读过关于Java序列化,JSON和XStream序列化的内容,因此我了解了每种技术的优缺点,特别是人类可读文件的优点。我还会看到一个典型的文件格式,例如来自微软的文件格式,以便了解可能的设计决策,从每一个字节重要的日子开始,以及如何扩展它们。例如:The WAV file format

0

Bencode可能是要走的路。

这是Daniel Spiewak的excellent implementation

不幸的是,bencode规范不支持utf8这对我来说是一个炫耀者。

稍后可能会出现这种情况,但目前xml看起来是更好的选择(将blobs序列化为Map)。

0

也许你可以解释这比使用现有的文件格式如JAR更好。

这种类型的大多数标准文件格式只是使用CRC作为其更快计算。如果您想防止故意修改,MD5更合适。

2

让我们看看这应该是非常简单的。

先决条件:

0应该是跨平台的被保留

1.信息包括单个POJO实际上&任意字节[] S(文件时,POJO将其名称存储在String []中)

2。仅需要

3.顺序存取应检查数据的一致性的方式

4.应该是小而快

5.应防止与归档的平均用户+从修改数据

那么你猜什么记事本,你很可能它已经,这是内置该平台已经:Object Serialization

如果需要减少线路发送的数据量,并提供自定义的序列化(比如你只能1,2,3发送给定对象,而无需使用属性名称或类似的东西,并以相同的顺序读取它们),你可以用这个方法"Hidden feature"

如果你确实需要它在“text plain”中,你也可以对它进行编码,它需要几乎相同的字节量。

比如这个bean:

import java.io.*; 
public class SimpleBean implements Serializable { 
    private String website = "http://stackoverflow.com"; 
    public String toString() { 
     return website; 
    } 
} 

可以这样表示:

rO0ABXNyAApTaW1wbGVCZWFuPB4W2ZRCqRICAAFMAAd3ZWJzaXRldAASTGphdmEvbGFuZy9TdHJpbmc7eHB0ABhodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20= 

See this answer

此外,如果你需要一个听起来协议,你也可以检查Protobuf,谷歌的内部交换格式。

1

我同意它并不像你需要一种新格式或二进制格式。 如果你真的想要一个二进制格式,为什么不考虑这些第一个:

  • 二进制XML(快速信息集,Bnux)
  • 黑森州
  • 谷歌数据包缓冲区

但除此之外,许多文本格式应该工作得很好(或者更好);容易调试,大量的工具支持,压缩到与二进制大小相同的大小(二进制压缩效果不佳,信息理论表明,对于相同的有效信息,可以实现相同的压缩率 - 这在我的测试中是正确的)。

因此,或许也考虑:

因此,它有点像你只是想建立自己的东西。作为一种爱好,没有什么不对,但如果是这样的话,你需要考虑它。 这可能不是您正在构建的系统的要求。