Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为java开发(文件)交换格式_Java_Serialization_Binary_Format - Fatal编程技术网

为java开发(文件)交换格式

为java开发(文件)交换格式,java,serialization,binary,format,Java,Serialization,Binary,Format,我想提出一种二进制格式,用于以POF(纯旧文件;)的形式在应用程序实例之间传递数据 先决条件: 应该是跨平台的 要持久化的信息包括单个POJO&任意字节[]s(实际上,POJO将其名称存储在字符串[]中) 只需要顺序访问 应该是检查数据一致性的一种方法 应该小而快 应防止使用archiver+记事本的普通用户修改数据 目前,我正在使用DeflaterOutputStream+OutputStreamWriter和InflaterInputStream+InputStreamReader来保存/恢

我想提出一种二进制格式,用于以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的正确方法是什么
  • 关于这个问题,你建议读什么

  • TIA.

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

    您可以使用zip(rar/7z/tar.gz/…)库。很多都存在,大多数都经过了很好的测试,这可能会为您节省一些时间

    可能没有那么有趣。

    1)这看起来正常吗

    看起来相当理智。然而,如果你打算发明自己的格式而不是仅仅使用它,那么你应该有一个很好的理由。你有什么好的理由吗(在某些情况下确实存在)?使用XStream的标准原因之一是使结果具有可读性,而二进制格式会立即丢失。您是否有充分的理由使用二进制格式而不是人类可读的格式?查看为什么人类可读性好(和坏)

    把所有东西都放在一个有签名的罐子里不是更容易吗。已经有很多方法可以做到这一点,并且提供了压缩和验证

    2) 您将使用什么作为分隔符以及如何确定它

    我宁愿在块之前显式存储每个块的长度,而不是分隔符。它同样简单,并且防止您在分隔符自动出现时必须跳出它

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

    有一种方法看起来很合理

    4) 关于这个问题,你建议读什么

    关于连载的问题?我读过关于Java序列化和XStream序列化的书,所以我了解了它们的优缺点,特别是人类可读文件的好处。我还将研究一种经典的文件格式,例如来自微软的文件格式,以了解在每个字节都很重要的年代可能做出的设计决策,以及这些决策是如何扩展的。例如:.

    可能是一种方法

    这是丹尼尔·斯皮瓦克的一篇文章

    不幸的是,bencode规范不支持utf8,这对我来说是一个阻碍


    稍后可能会谈到这一点,但目前xml似乎是一个更好的选择(将blob序列化为映射)。

    也许您可以解释一下,这比使用JAR等现有文件格式更好

    这种类型的大多数标准文件格式都使用CRC,因为它计算起来更快。如果你想防止故意修改,MD5更合适。

    它看起来很疯狂

    • 为什么要发明一种新的文件格式
    • 为什么只阻止愚蠢的用户更改文件
    • 为什么使用二进制格式(难以压缩)
    • 为什么使用接收时无法解析的格式?(接收方必须先接收整个文件,然后才能对该文件采取行动。)
    • XML已经是一种可压缩的序列化格式。因此,您正在序列化序列化格式

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

        先决条件:

        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的内部交换格式。

        我同意,听起来您并不需要新的格式或二进制格式。 如果你真的想要二进制格式,为什么不考虑其中的一个:

        • 二进制XML(快速信息集,Bnux)
        • 黑森
        • 谷歌数据包缓冲区
        但除此之外,许多文本格式也应该工作得很好(或者更好);易于调试,广泛的工具支持,压缩到与二进制文件大致相同的大小(二进制文件压缩效果很差,信息理论表明,对于相同的有效信息,可以获得相同的压缩率——这在我的测试中是正确的)

        因此,或许还可以考虑:

        • Json运行良好;通过base64提供二进制支持(例如,)
        • XML也不错;高效的流式解析器,其中一些具有base64支持(,'org.codehaus.stax下的“类型化访问API”)