Serialization 在运行时向序列化对象添加额外字段
我想向对象添加一个额外的字段(例如UUID),即在运行时使用javassist或反射进行序列化或已经序列化 可能吗 简短回答 你不能随心所欲,但也许还有其他方法 长话短说 让我们从一些定义开始: Javassist:是一个用于在Java中编辑字节码的类库。它使Java程序能够在运行时定义新类,并在JVM加载给定类文件时修改它 反射:是Java编程语言中的一项功能。它允许正在执行的Java程序对自身进行Serialization 在运行时向序列化对象添加额外字段,serialization,javassist,Serialization,Javassist,我想向对象添加一个额外的字段(例如UUID),即在运行时使用javassist或反射进行序列化或已经序列化 可能吗 简短回答 你不能随心所欲,但也许还有其他方法 长话短说 让我们从一些定义开始: Javassist:是一个用于在Java中编辑字节码的类库。它使Java程序能够在运行时定义新类,并在JVM加载给定类文件时修改它 反射:是Java编程语言中的一项功能。它允许正在执行的Java程序对自身进行检查或内省,并操作程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们 因此,正如
检查或内省
,并操作程序的内部属性
。例如,Java类可以获取其所有成员的名称并显示它们
因此,正如我在Javassist
中强调的那样,您可以轻松地向类添加一个字段,但只能在加载时添加(这意味着JVM将类加载到其内存中时)
相反,使用反射
可以查找类的属性,甚至修改它们,但是没有办法添加新属性
我的建议
我现在不知道这对您的用例是否可行,但解决方案可能是同时使用它们:
使用Javassist
将UUID字段添加到加载时可能需要它的类中
在序列化对象之前,可以使用反射
将此UUID字段实际设置为所需的值,然后对其进行序列化
实际上,无需反射就可以实现,而无需为要向其添加自定义属性的对象的类设置任何窗口-可以先将对象转换为如下属性映射
这是我为此写的一个方法
/**
* To convert the current Object to a AttributeMap. This allows for using this map
* to add to it in a subclass additional attributes for Serialization. It would be
* required in a scenario when you want to alter the simple Jackson Serialization
* methodology(where you just annotate the fields to be included in Serialization
* and that's it.). A non-simple scenario would involve adding custom fields decided
* at runtime
* @return The AttributeMap of this object.
*/
protected Map<String, Object> toAttributeMap(Object object){
return objectMapper.convertValue(object, new TypeReference<Map<String, Object>>() {
});
}
/**
*将当前对象转换为属性映射。这允许使用此地图
*将附加属性添加到子类中以进行序列化。是的
*当您想要更改简单的Jackson序列化时,在场景中是必需的
*方法(您只需注释要包含在序列化中的字段
*就这样。一个非简单的场景需要添加自定义字段
*运行时
*@返回该对象的属性映射。
*/
受保护映射到属性映射(对象){
返回objectMapper.convertValue(对象,新类型引用(){
});
}
现在,您可以添加到对象的属性映射中,然后将()放入字段中,并将其转换为JSON字符串
关于答案的注释:
- 它使用Jackson的对象映射器API
- 它不使用JavaAssist
我的问题是,我无法在加载时直接将其添加到类中,因为我不知道它是哪个类。一旦对象序列化,我可以在运行时使用javassist获取类名。我只想通过序列化的对象传递UUID。所以我可以在链的另一端获取它,在那个里它将被反序列化。然后,只有在需要的类中以及需要时(在序列化之前),才可以将此字段设置为正确的值。在您更改的所有其他类中,简单地添加一个字段不会改变任何东西。好的,让我知道它是如何运行的:)它按预期工作。bcz由于一些逻辑错误,它以前工作不正常。但它现在可以正常工作了。塔克斯