0

私のアプリでは、カスタム コレクション型の配列をシリアル化する必要があります。

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

シリアル化に必要なデータ サイズを最適化するより良いオプションはありますか?

4

2 に答える 2

1

サイズ効率が目標の場合は、次の 2 つのことを行います。

  1. サイズ値の後に実際の値を書き込むシステムを使用してください。
  2. 結果をGZipOutputStreamにフィードします

2 つを比較し、圧縮されたバージョンの方が小さければ (値が約 100 を超える場合は小さくなる)、そのバージョンを使用できます。

値を逆シリアル化するときに、ストリームの圧縮解除を試みることができます。それが有効でない場合は、圧縮されたバージョンではないと想定してください (圧縮解除を try/catch ブロックに入れ、圧縮されていないデコードをキャッチ側に配置します)。 .

于 2013-10-31T23:40:35.700 に答える
1

2つの解決策が考えられます...

1) 配列内の各エントリに対して、index、sizeOfCollection、x1、x2、x3 ... newline などの CSV スタイルを使用します。

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 に答える