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 或其他机制来执行此操作。

重新编译、重新创建 A 类将不是解决方案。我已经在服务器上部署并运行了这个类,我唯一​​能做的就是通过远程 groovy-shell 改变它的元行为。

4

2 回答 2

0

我已经尝试过了,我不相信这是可能的

即使使用反射并在类中声明的字段上设置修饰符,序列化仍会跳过该属性

我认为唯一的解决方案是编写自己的序列化例程,忽略瞬态修饰符。

或者当然,改变课程(但你说这是不可能的)

于 2012-04-05T08:31:20.233 回答
0

如果要控制瞬态字段的序列化,请使用 json-io ( https://github.com/jdereg/json-io ) Java / Groovy 序列化库。它允许您关联一个类,该类将告诉序列化程序要序列化哪些字段。此列表被指定为字符串列表。换句话说,您可以逐类有效地告诉序列化程序您想要序列化哪些字段。因此,如果您只有一个类导致您出现问题,请指定您想要序列化的字段,包括瞬态字段,它们将被序列化。

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 回答