2012-04-04 7 views
0

Wir haben eine einfache Groovy Klasse entfernen:Groovy - Klasse Feld transient Modifier metaclass

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

wie wir wissen, wir Eigenschaften und Methoden einer Klasse wie die in Runtime metaclass Eigenschaft (metaprograming) mit Groovy ändern .

Was ich tun möchte, ist: entfernen Sie die "transiente" Modifikator aus der 't' Eigenschaft der Klasse A und lassen Sie es dieses Feld zu serialisieren. Ich muss dies in der Runtime mit MetaClass oder einem anderen Mechanismus tun.

Neukompilieren, erneut erstellen Eine Klasse wird keine Lösung sein. Ich habe diese Klasse implementiert und läuft auf dem Server und das einzige, was ich damit machen kann, ist das Ändern des Meta-Verhaltens über Remote-Groovy-Shell.

Antwort

0

Ich habe gehen an diese hatte, und ich glaube nicht, dass es möglich ist,

Selbst Reflexion und Einstellung der Modifikatoren auf dem angegebenen Feld aus der Klasse, Serialisierung noch die Eigenschaft überspringt

mit der Verwendung von

Ich denke, die einzige Lösung wäre, Ihre eigene Serialisierungsroutine zu schreiben und den Übergangsmodifikator zu ignorieren.

Oder natürlich die Klasse ändern (aber Sie sagen, dass dies nicht möglich ist)

0

Wenn Sie die Serialisierung von transienten Felder steuern möchten, verwenden Sie die Json-io (https://github.com/jdereg/json-io) Java/Groovy Serialisierung Bibliothek. Sie können eine Klasse zuordnen, die dem Serializer die zu serialisierenden Felder angibt. Diese Liste wird als String-Liste angegeben. Mit anderen Worten, Sie können dem Serializer auf Klassenbasis effektiv mitteilen, welche Felder serialisiert werden sollen. Wenn Sie also nur eine Klasse haben, die Probleme verursacht, geben Sie an, welche Felder serialisiert werden sollen, einschließlich der transienten Felder, und sie werden serialisiert.

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

Wenn Sie mehr als eine Klasse hatte die vorübergehende Felder hatte zu serialisiert:

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

Die (A.class) ist in Klammern, weil ein Schlüssel in einem starken Map in Klammern sein muss, wenn Es ist kein String.

Verwandte Themen