0

単純な Groovy クラスがあります。

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

ご存知のように、Groovy の metaClass プロパティ (メタプログラミング) を使用して、実行時にそのようなクラスのプロパティとメソッドを変更できます。

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

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

4

2 に答える 2

0

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

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

シリアル化する一時フィールドを持つ複数のクラスがある場合:

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 Map のキーが文字列でない場合は括弧で囲む必要があるためです。

于 2015-01-26T17:05:31.107 に答える
0

私はこれを試してみましたが、それが可能だとは思いません

リフレクションを使用し、クラスから宣言されたフィールドに修飾子を設定しても、シリアル化はプロパティをスキップします

唯一の解決策は、一時的な修飾子を無視して、独自のシリアル化ルーチンを作成することだと思います。

またはもちろん、クラスを変更します(ただし、これは不可能だとあなたは言います)

于 2012-04-05T08:31:20.233 に答える