我々は、データをシリアル化するためにListオブジェクトのMessagePackを使用し、そのシリアライズ後のバイナリ配列データの場合は大きすぎたとき。
あなたのListオブジェクトに格納されている関連コンテンツに応じて、必ずしもすべてのListオブジェクトのが発生しますのでご注意ください。
:この問題のテストのソースコードについては、を参照してくださいhttps://github.com/cwiki-us-demo/serialize-deserialize-demo-java/blob/master/src/test/java/com/insight/demo/serialize/ MessagePackDataTest.javaの 内容。
次のコードを考えてみます。
リスト<のMessageData>のDataList = MockDataUtils.getMessageDataList(600000); ObjectMapper objectMapper =新しいObjectMapper(新MessagePackFactory()); 生= objectMapper.writeValueAsBytes(データリスト)。 FileUtils.byteCountToDisplaySize(raw.length)。 logger.debug( "RAWサイズ:[{}]"、FileUtils.byteCountToDisplaySize(raw.length))。
我々は600個の000オブジェクトのシリアル化の一覧については、このデータは33メガバイトに達しています。
我々はいくつかのパラメータを追加するための時間ObjectMapperオブジェクトを定義した場合、我々は、サイズが大幅に改善されることがわかります。
以下のコードを参照してください。
リスト<のMessageData>のDataList = MockDataUtils.getMessageDataList(600000); ObjectMapper objectMapper =新しいObjectMapper(新MessagePackFactory()); objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES、真の); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES、偽); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)。 objectMapper.setAnnotationIntrospector(新しいJsonArrayFormat()); rawJsonArray = objectMapper.writeValueAsBytes(データリスト)。 logger.debug( "rawJsonArrayサイズ:[{}]"、FileUtils.byteCountToDisplaySize(rawJsonArray.length))。
あなたは上記のコードを実行する場合は、出力文字列のプログラムは、23メガバイトに縮小されますが表示されます。
これは主に内部にある objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
この文が役割を果たしました。
通常のシナリオでは、我々は、すなわち、プロパティで指定された属性を構文解析するフィルタをJsonIgnoreを注釈することができます。
クラスの実際の実装はされて 注釈を読むことによって達成属性がオフに除外する必要があるかどうかを決定すべきです。デフォルト されて 行われますが、我々はできる方法では、 カスタムを実装して再割り当てします。JacksonAnnotationIntrospector
hasIgnoreMarker
ObjectMapper
AnnotationIntrospector
JacksonAnnotationIntrospector
ObjectMapper.setAnnotationIntrospector
https://www.cwiki.us/display/Serialization/MessagePack+Jackson+Data+Size