2016-12-08 3 views
0

Flinkストリーム処理ジョブの内部でオブジェクトをJsonにシリアル化する必要があります。フリンクジョブの内部では、すべてのオブジェクトをシリアライズ可能にする必要があります。Jackson Jodaの日付形式をシリアル化する方法は?

私はオブジェクトをシリアル化するためにジャクソンを使用しています。

java.io.NotSerializableException: com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat 

がどのように私は、シリアライズジョダモジュールなどのオブジェクトマッパーを行うことができます。

final ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JodaModule()); 
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 

私はこれを使用していて、私は次の例外を取得しますか?

+0

あなたがシリアル化しようとしているオブジェクトは、どのように見えますか? JSON表現に変換できるオブジェクトではないメンバー変数として 'JacksonJodaDateFormat'があるようです。 '@ JsonIgnore'を使ってそのフィールドを除外したいかもしれません。 – Jesper

+0

@JesperそれはJSONにシリアル化することではありません(ジャクソンは、必要であれば 'JacksonJodaDateFormat'をシリアライズするのに問題はありませんが、それは役に立ちません)。これはJavaのシリアル化です。 'JacksonJodaDateFormat'は' Serializable'ではありません。 –

+0

@SotiriosDelimanolisはい、そうです。その場合、CPAはフィールドを「一時的」にすることができます。 – Jesper

答えて

2

Flinkは、データオブジェクトをカスタムシリアライザでシリアル化します(未知のオブジェクトはKryoでシリアル化されています)。しかし、機能オブジェクト(すなわち、MapFunctionのような機能インタフェースを実装するクラスのオブジェクト)は、Java直列化を用いてクラスタに出荷される。

ここでの問題は、ObjectMapperクラスにシリアル化可能ではないフィールドがあるようです。 RichFunctionとしての機能を実装し、最初の前に呼び出されRichFunction.open()方法で非直列化可能フィールドを初期化する)は、Javaの直列化メソッドまたは 2を上書き)

1:あなたはtransientにフィールドを設定しようとすることができますどちらかレコードが処理されます。

+0

RichFunction.open()関数で直列化不可能なオブジェクトを初期化しました!オブジェクトを静的にすることもできます。 – CPA

+0

関数内の静的メンバーは危険です。それらは同じタスクマネージャー上のすべての演算子によって共有されます。したがって、すべてのメソッドがスレッドセーフであることを確認する必要があります。そうしないと、例外や奇妙な副作用が発生します。 –

関連する問題