2013-07-26 55 views
2

我想使用Ebean ORM序列化我的MySQL數據庫上的Java類。具有自定義對象屬性的Serialize java類

我的類定義是類似以下內容:

public class Test implements Serializable 
{ 
    @Id 
    private Long id; 
    ... 
    ... 
    ... 
    @Lob 
    private MyClass1 obj1; 
    @Lob 
    private MyClass2 obj2; 
    ... 
    ... 
    //getters and setters 
} 

在我的類MyClass1的和MyClass2基本上都是針對一個

float[] 

包裝和

Hashmap<String, Float> 

,並都實現可序列化的接口。

我不希望有創建一個類:

@Lob 
byte[] obj1bytes; 
@Transient 
MyClass1 obj1Obj; 
@Lob 
byte[] obj2bytes; 
@Transient 
MyClass2 obj2Obj; 
//getters and setters 

我想什麼來獲得的序列化和反序列化自動這個類,而不必使用字節[]數組來保存OBJ1和OBJ2使用

Ebean.save(testClassInstance); 
Ebean.find(Test.class, ID); 

EDIT1我的測試類到MySQL表有兩種LONGBLOB字段:MyClass1的定義如下:

public class MyClass1 implements Interface1 { 
    private float[] vector; 
    public MyClass1() { 
    } 
    public MyClass1 (float[] vector) { 
     this.vector = vector; 
    } 
    public float[] getVector() { 
     return vector; 
    } 
    public void setVector(float[] vector) { 
     this.vector = vector; 
    } 
    @Override 
    public byte[] serialize() throws Exception { 
     ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
     ObjectOutputStream out = new ObjectOutputStream(byteOut); 
     out.writeObject(object); 
     out.close();    
     return byteOut.toByteArray(); 
    } 
    @Override 
    public void deserialize(byte[] bytes) throws Exception { 
     ByteArrayInputStream byteInt = new ByteArrayInputStream(bytes); 
     ObjectInputStream out = new ObjectInputStream(byteInt); 
     vector = (float[])out.readObject(); 
    } 
    @Override 
    public float cossim(MyClass1 v) throws Exception { 
     method logic 
    } 
    @Override 
    public MyClass1 add(MyClass1 v) throws Exception { 
     method logic 
    } 
} 

MyClass2被定義爲MyClass1,而不是float [] vector我有一個HashMap < String,Float>()。值得一提的唯一的區別是序列化()和反序列化():

@Override 
public byte[] serialize() throws Exception { 
    ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(outStream); 
    out.writeInt(map.size()); 
    Iterator<String> iterator = map.keySet().iterator(); 
    while (iterator.hasNext()) { 
     String key = iterator.next(); 
     out.writeUTF(key); 
     out.writeFloat(map.get(key)); 
    } 
    return outStream.toByteArray(); 
} 

@Override 
public void deserialize(byte[] bytes) throws Exception { 
    try { 
     ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); 
     DataInputStream in = new DataInputStream(inStream); 
     this.map = new HashMap<>(); 
     int n = in.readInt(); 
     for (int i = 0; i < n; i++) { 
     map.put(in.readUTF(), in.readFloat()); 
     } 
    } catch (Exception ex) { 
     throw ex; 
    } 
} 

回答

0

其實這是沒有必要換float[]HashMap<String,float>,因爲他們本身是序列化的。

另一件事是,如果MyClass1MyClass2是可序列化比你可以使用@Lob。據this wikibook

默認情況下在JPA任何可序列化屬性,該屬性是不是一個 關係或者基本類型(字符串,數字,時間,原語), 將被序列對BLOB字段。

在該wikibook中,還有一個使用@Lob作爲Image類的示例。

@Entity 
public class Employee { 
    ... 
    @Basic(fetch=FetchType.LAZY) 
    @Lob 
    private Image picture; 
    ... 
} 

希望這可能會幫助你。

+0

謝謝您的回覆。實際上我已經讀過wikiboook,完全一樣:我使用@Lob註釋了MyClass1和MyClass2對象,但是當我執行Ebean.save(testInstance)時,除了這兩個字段之外,每個字段都保存在數據庫中。我需要包裝那些float []和HashMap ,因爲它們需要對它們做一些特定的操作,需要創建兩個類。 – Andrea

+0

@Andrea你可以發佈你的MyClass1和MyClass2嗎? – Ramsharan

+0

我修改了我的問題以包含MyClass1和MyClass2定義(其中大部分實際上是) – Andrea

0

我在回覆後做了一些編碼。

條件:ClassB的字段應該是可序列化的,並且字段的字段應該是可序列化的,並且....

ClassB的:

import java.io.Serializable; 

public class ClassB implements Serializable{ 
    private static final long serialVersionUID = 1L; 
    String b; 

    public String getB() { 
     return b; 
    } 

    public void setB(String b) { 
     this.b = b; 
    } 

} 

ClassA的:

import java.io.Serializable; 

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Lob; 

@Entity 
public class ClassA implements Serializable{ 
    private static final long serialVersionUID = 1L; 
    @Id 
    String a; 
    @Lob 
    ClassB b; 

    public String getA() { 
     return a; 
    } 
    public void setA(String a) { 
     this.a = a; 
    } 
    public ClassB getB() { 
     return b; 
    } 
    public void setB(ClassB b) { 
     this.b = b; 
    } 

} 

這裏,包含的ClassA ClassB的對象。你可以在ClassB中添加任何邏輯,它可以工作。我的序列化和反序列化重寫有一個小問題。我認爲你不需要那樣做。它將在序列化時默認完成。最後,這些代碼按照我的嘗試工作。

希望這會幫助你。

+0

我試過了你的確切代碼,它不起作用。你能分享你的ebean.properties嗎? Ebean不會在我的MySQL數據庫中創建LOB列。你有沒有運行你的示例代碼?你使用了哪些組件?你使用哪個版本的Ebean庫? – Andrea

+0

它提供任何錯誤或其他? – Ramsharan

+0

根本沒有錯誤,Ebean完全忽略了所有不是byte []的Lob。 – Andrea

相關問題