0

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

IntList[] collections; // need to be serialized

由于我们使用的编码环境的性质,我不能依赖 3rd 方或任何 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

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

4

2 回答 2

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
        ]
    }
]

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

于 2013-10-31T23:44:43.873 回答
1

如果尺寸效率是目标,那么做两件事:

  1. 使用您的系统编写大小值,然后是实际值。
  2. 将结果输入到GZipOutputStream

比较两者,如果压缩版本更小(超过大约 100 个值左右,它会更小),那么您可以使用该版本。

反序列化值时,您可以尝试解压缩流,如果它无效,则假设它不是开始的压缩版本(将解压缩放在 try/catch 块中,将未压缩解码放在 catch 端) .

于 2013-10-31T23:40:35.700 回答