0

我有两个对象 userBO 和 userEntity。我想将对象值从 userEntity 传输到 userBO,并且我要求在传输值时序列化不应该丢失。这就是我正在做的事情。请告诉我这是正确的吗?

public static UserBO converUserEntityToUserBO(UserEntity userEntity) {
    UserBO userBO = new UserBO();
    userBO.setUserId(userEntity.getUserId());
    userBO.setUserFile(userEntity.getUserFile());
    userBO.setUserDepartment(userEntity.getUserDepartment());
    return userBO;
}

用户BO.class

public class UserBO implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 3886993061934034729L;

    private int userId;
    private int departmentId;
    private byte[] userFile;
    private String dbAction;

    //getter and setter 
}

用户实体类

@Entity
@Table(name="USER_ENTITY")
public class UserEntity implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -4676281792392490908L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private int userId;

    @Column(name="USER_DEPARTMENT")
    private String userDepartment;

    @Lob()
    @Column(name="USER_FILE")
    private byte[] userFile;

      //getter and setter

}
4

3 回答 3

2

每个可序列化的类都有一个与之关联的唯一标识号,您已经为UserBOUserEntity类明确指定了该标识号:

public class UserBO implements Serializable {
private static final long serialVersionUID = 3886993061934034729L;
...
}
public class UserEntity implements Serializable {
private static final long serialVersionUID = -4676281792392490908L;
...
}

如果您没有通过声明一个名为 的静态最终长字段来明确指定此数字serialVersionUID,则系统会在运行时通过对类应用复杂的过程来自动生成它。

自动生成的值受class’s name, the names of the interfaces it implements, and all of its public and protected members. 如果您以任何方式更改任何这些内容,例如,通过添加新方法,自动生成的串行版本 UID 会更改。这会破坏兼容性,并可能导致InvalidClassExceptions反序列化过程中出现意外。

但是您serialVersionUID在两个类中都声明了一个显式值,这保证了serialVersionUID不同 java 编译器实现的值一致;因此该方法在将数据从 传输到converUserEntityToUserBO时不会导致任何序列化问题。UserEntityUserBO

于 2013-10-24T12:09:23.917 回答
1

由于您的两个类具有相同的字段,因此 java 反射可以帮助您以更好的方式进行操作。试试这个。

public UserBO loadData (UserEntity userEntity) throws Exception{

    Method[] gettersAndSetters = userEntity.getClass().getMethods();
     UserBO userBO = new UserBO();
    for (int i = 0; i < gettersAndSetters.length; i++) {
            String methodName = gettersAndSetters[i].getName();
            try{
              if(methodName.startsWith("get")){
                 userBO.getClass().getMethod(methodName.replaceFirst("get", "set") ,  
       gettersAndSetters[i].getReturnType() ).invoke(userBO, 
                         gettersAndSetters[i].invoke(userEntity, null));
                    }else if(methodName.startsWith("is") ){
                        userBO.getClass().getMethod(methodName.replaceFirst("is", "set") 
                 ,  gettersAndSetters[i].getReturnType()  ).invoke(userBO, gettersAndSetters[i].invoke(userEntity, null));
                    }

            }catch (NoSuchMethodException e) {

            }catch (IllegalArgumentException e) {

            }

    }

    return null;
}
于 2013-10-24T12:06:12.073 回答
0

你可以用 apache bean utils 做同样的事情,请参考下面的例子。

** 这里在两个 DTO 中具有相同名称的属性值只会从源复制到 taget。

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.builder.ToStringBuilder;

public class BeanUtilsCopyPropertiesTest {

    public static void main(String[] args) {

        FromBean fromBean = new FromBean("fromBean", "fromBeanAProp", "fromBeanBProp");
        ToBean toBean = new ToBean("toBean", "toBeanBProp", "toBeanCProp");

        try {
            System.out.println("Copying properties from fromBean to toBean");
            BeanUtils.copyProperties(toBean, fromBean);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println(ToStringBuilder.reflectionToString(fromBean));
        System.out.println(ToStringBuilder.reflectionToString(toBean));
    }

}

于 2013-10-24T11:48:11.867 回答