これは基本的にはシリアル化しています。バイト配列に長い値をダンプしてから、このようなBase64として、互換性のある表現にそれをエンコード:それはあなたのためのより便利であれば
import java.util.Base64;
public String encodeLongs(long[] numbers) {
byte[] bytes = new byte[8 * numbers.length];
for (int i = 0; i < numbers.length; i++) {
// Taken from https://stackoverflow.com/questions/18687772/java-converting-long-to-bytes-which-approach-is-more-efficient
long v = numbers[i];
int idx = i * 8;
bytes[idx + 0] = (byte)(v >>> 56);
bytes[idx + 1] = (byte)(v >>> 48);
bytes[idx + 2] = (byte)(v >>> 40);
bytes[idx + 3] = (byte)(v >>> 32);
bytes[idx + 4] = (byte)(v >>> 24);
bytes[idx + 5] = (byte)(v >>> 16);
bytes[idx + 6] = (byte)(v >>> 8);
bytes[idx + 7] = (byte)(v >>> 0);
}
return Base64.getEncoder().encodeToString(bytes);
}
また、文字列の代わりにバイト配列を返すことができます。 Base64エンコードは、元のサイズのおよそ1/3のオーバヘッドで発生します(UTF-8などのエンコーディングを使用する場合)。テキストベースの形式を使用している場合、一般的にゼロオーバーヘッドを持つことはできませんが、Base-122などの他のエンコーディングを調べることはできますが、Base64は普及しており、ほとんどの言語で既に実装されているという利点があります。
もう1つのオプションは、バイト配列を最初に圧縮し(たとえば、GZIP)、その後Base64でエンコードします。入力のサイズ、数字の性質(例えば、ある範囲内にあるかどうかなど)、および圧縮アルゴリズムによっては、多かれ少なかれ成功する可能性がありますが、数値が全範囲にわたってランダムに分布している場合長い数字の場合は、おそらく多くを圧縮することはできません。
+1は本当に簡潔な答えであり、あなたの解が描かれた既存のSO質問へのクレジット/参照。 –
@jdehesa、私はあなたがちょうどそれがコンパクトではないので、全体のオブジェクト(ロングの配列)としてそれをシリアル化することを提案していないと思いますか?または、私はここで何かを逃しています。 – eddyP23
@ eddyP23まあ、私はあなたが単純で相互運用可能なフォーマットを望んでいたと思っていました。サイズに対して最適化されていないにもかかわらず、標準的なJavaのシリアライゼーションが導入するオーバーヘッドはどれくらいかとは言えません(また、配列のサイズなどの追加情報を格納する必要があります)。 [Kryo](https:// github。)のような[その他のシリアル化ライブラリ](https://stackoverflow.com/questions/239280/which-is-the-best-alternative-for-java-serialization)も参照できます。 com/EsotericSoftware/kryo)。いずれにしても、バイナリシリアル化を使用すると、テキスト互換のエンコーディングが必要になります。 – jdehesa