2013-10-24 97 views
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; 
} 

UserBO.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 
} 

UserEntity.class

@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 

} 
+0

它看起來不錯.. – Ashish

回答

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值,這保證了跨不同java編譯器實現的一致的serialVersionUID值;所以在將數據從UserEntity傳輸到UserBO時,方法converUserEntityToUserBO不會導致任何序列化問題。

0

你可以做與Apache豆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)); 
    } 

}

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; 
} 
相關問題