java - 如何在 Javabean 中将属性标记为 transient 以避免被 XMLEncoder 序列化?

标签 java javabeans

在变量声明上使用“transient”关键字或在 getter 上使用“@Transient”不会阻止 XMLEncoder 序列化属性。我发现告诉 XMLEncoder 不要序列化特定属性的唯一方法是使用如下代码:

BeanInfo info = Introspector.getBeanInfo(MyClass2.class);
PropertyDescriptor[] propertyDescriptors = info.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; ++i) {
    PropertyDescriptor pd = propertyDescriptors[i];
    if (pd.getName().equals("props")) {
        pd.setValue("transient", Boolean.TRUE);
    }
}

真的吗???有没有不需要运行时代码循环遍历所有属性的更简单的方法?像 transient 修饰符这样的东西会摇滚!

这是一个 JavaBean,它的所有属性都由 XMLEncoder 序列化,尽管使用了“transient”:

import java.io.Serializable;
import java.beans.XMLEncoder;

public class TestJavaBeanSerialization implements Serializable {
    public TestJavaBeanSerialization() {}
    private transient String myProp1 = null;
    private String myProp2 = null;
    @Transient public String getMyProp1() { return myProp1; }
    public void setMyProp1(String a) { myProp1 = a; }
    public String getMyProp2() { return myProp2; }
    public void setMyProp2(String a) { myProp2 = a; }

    public static void main( String[] args ) {
        TestJavaBeanSerialization myObj = new TestJavaBeanSerialization();
        myObj.setMyProp1("prop 1");
        myObj.setMyProp2("prop 2");
        XMLEncoder encoder = new XMLEncoder(System.out);
        encoder.writeObject(myObj);
        encoder.close();        
    }

}

这是运行这个程序的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_29" class="java.beans.XMLDecoder"> 
 <object class="TestJavaBeanSerialization"> 
  <void property="myProp1"> 
   <string>prop 1</string> 
  </void> 
  <void property="myProp2"> 
   <string>prop 2</string> 
  </void> 
 </object> 
</java> 

更新

我仍然没有收到原始问题的明确答案。人们不断引用这篇文章,但它并不清楚,也没有人提供对 API 或规范的引用,明确指出将属性标记为 transient 的唯一方法是遍历所有属性并调用“setValue”。

最佳答案

你用错了@Transient

应该使用 java.beans.Transient 作为注解。 javax.persistence.Transient 仅在数据库持久性上下文中受到尊重,而不是 BeanInfo 序列化。

关于java - 如何在 Javabean 中将属性标记为 transient 以避免被 XMLEncoder 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8813631/

相关文章:

java - 组织.apache.jasper.JasperException : Unable to compile class for JSP:

java - "Column Not Found"错误?

Spring:Bean属性不可写或具有无效的setter方法

java - Spring:如何确保类仅由 spring 实例化,而不是通过关键字 new 实例化

java - 使用注释创建原型(prototype)范围的 Spring bean?

java - 从根上下文访问 bean 时出现 Spring NoSuchBeanDefinitionException

java - 将两个 Java Maven 项目合并为一个

java - 使用 Java 和 ant 进行条件编译

java - Java SSLSocket 和 HTML5 之间的通信

java - 如何将多个字符串值添加到 ArrayList?