2012-04-04 13 views
0

を使用して、クラスのフィールドtransient修飾子を削除します。私たちが知っているようにGroovyの - 私たちは、単純なGroovyのクラス持っメタクラス

class A implements Serializable { 
    transient Integer t // this field is transient in the serialization process 
    Object o 
} 

を、我々は(metaprograming)Groovyのメタクラスのプロパティを使用して実行時のそのようなクラスのプロパティとメソッドを変更することができます。

Aクラスの 't'プロパティから 'transient'修飾子を削除し、このフィールドをシリアル化するようにしてください。私はmetaClassまたは別のメカニズムを使用して、これをランタイムで実行する必要があります。

クラスの再コンパイル、再作成は解決策にはなりません。私はこのクラスをサーバー上に配備して実行していますが、リモートgroovy-shellを介してメタ動作を変更することで唯一行うことができます。

答えて

0

私はこれで行く持っていた、と私はそれもリフレクションを使用して、クラスから宣言したフィールド上で修飾子を設定すると、シリアル化はまだ財産

をスキップ

可能だと信じていません私は唯一の解決策は、一時的な変更を無視して、独自のシリアル化ルーチンを記述することだと思う。

またはコースの、クラスを変更する(ただし、これができないと言う)

0

あなたは過渡フィールドの直列化を制御したい場合は、JSON-IO(https://github.com/jdereg/json-io)を使用するJava/Groovyのシリアライズライブラリ。シリアライザにどのフィールドをシリアル化するかを指示するクラスを関連付けることができます。このリストは文字列リストとして指定されます。つまり、シリアライザに、クラスごとにシリアル化するフィールドを効果的に伝えることができます。そのため、問題を引き起こすクラスが1つしかない場合は、一時フィールドを含む直列化するフィールドを指定し、シリアル化されます。

def custom = [(A.class):['t', 'o'], (B.class):['field1','field2'], ...] 
def args = [(JsonWriter.FIELD_SPECIFIERS):custom] 
def json = JsonWriter.objectToJson(root, args) 
println json 

(A.class)を括弧内にあるGroovyの地図でキーがカッコ場合にする必要があるため:あなたはtransientフィールドがシリアライズしていた複数のクラスを持っていた場合

def custom = [(A.class):['t', 'o']] 
def args = [(JsonWriter.FIELD_SPECIFIERS):custom] 
def json = JsonWriter.objectToJson(root, args) 
println json 

それは文字列ではありません。

関連する問題