在Java中序列化列表数组的最简单方法

时间:2013-10-31 23:12:15

标签: java android serialization

在我的应用程序中,我需要序列化自定义集合类型的数组:

IntList[] collections; // need to be serialized

由于我们正在使用的编码环境的性质,我不能依赖第三方或任何Java内置包来进行序列化,并且必须自己完成所有这些。

我能想到的最好方法是将它全部存储在一个大字节数组中,在序列化之前编码每个元素的长度。

例如,对于看起来像这样的集合数组:

| 0 |  (1, 6, 3, 7)
| 1 |  (7, 2, 4, 6)
| 2 |  ( 1 )

将序列化为:

4 (length of collection at 0) followed by the elements
4 (length of collection at 1) followed by the elements
1 (length of collection at 2) followed by the elements

是否有更好的选项可以优化序列化所需的数据大小?

2 个答案:

答案 0 :(得分:1)

如果规模效率是目标,那么做两件事:

  1. 使用您的系统编写一个大小值,后跟实际值。
  2. 将结果提供给GZipOutputStream
  3. 比较两者,如果压缩版本较小(超过约100个值,或者它会更小),那么你可以使用该版本。

    当反序列化值时,您可以尝试解压缩流,如果它无效,那么只是假设它不是压缩版本的开头(将解压缩放在try / catch块中,并将未解压缩的解码放入抓住一边)。

答案 1 :(得分:1)

我看到两种可能的解决方案......

1)对数组中的每个条目使用CSV样式,如index,sizeOfCollection,x1,x2,x3 ... newline等。

2)这个想法不那么简单,但至少你会使用的格式不是你编造的奇怪的格式。这不是一个好习惯。

编写一个简单的JSON解析器。输出类似以下内容......

[
    {
        "index": 0,
        "size": 4,
        "values": [
            1,
            6,
            3,
            7
        ]
    },
    {
        "index": 1,
        "size": 4,
        "values": [
            7,
            2,
            4,
            6
        ]
    },
    {
        "index": 2,
        "size": 1,
        "values": [
            1
        ]
    }
]

再次警惕非规范化,不确定为什么在序列化中确实需要索引和大小?