Serialization 在运行时向序列化对象添加额外字段

Serialization 在运行时向序列化对象添加额外字段,serialization,javassist,Serialization,Javassist,我想向对象添加一个额外的字段(例如UUID),即在运行时使用javassist或反射进行序列化或已经序列化 可能吗 简短回答 你不能随心所欲,但也许还有其他方法 长话短说 让我们从一些定义开始: Javassist:是一个用于在Java中编辑字节码的类库。它使Java程序能够在运行时定义新类,并在JVM加载给定类文件时修改它 反射:是Java编程语言中的一项功能。它允许正在执行的Java程序对自身进行检查或内省,并操作程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们 因此,正如

我想向对象添加一个额外的字段(例如UUID),即在运行时使用javassist或反射进行序列化或已经序列化

可能吗

简短回答 你不能随心所欲,但也许还有其他方法

长话短说 让我们从一些定义开始:

Javassist:是一个用于在Java中编辑字节码的类库。它使Java程序能够在运行时定义新类,并在JVM加载给定类文件时修改它

反射:是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由于一些逻辑错误,它以前工作不正常。但它现在可以正常工作了。塔克斯