使用自定义对象属性序列化java类

使用自定义对象属性序列化java类,java,mysql,serialization,ebean,Java,Mysql,Serialization,Ebean,我想使用ebeanorm在MySQL数据库上序列化一个Java类 我的类定义类似于以下内容: public class Test implements Serializable { @Id private Long id; ... ... ... @Lob private MyClass1 obj1; @Lob private MyClass2 obj2; ... ... //getters and

我想使用ebeanorm在MySQL数据库上序列化一个Java类

我的类定义类似于以下内容:

public class Test implements Serializable
{
    @Id
    private Long id;
    ...
    ...
    ...
    @Lob
    private MyClass1 obj1;
    @Lob
    private MyClass2 obj2;
    ...
    ...
    //getters and setters
}
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
   }
}
我的类MyClass1和MyClass2基本上是

float[] 

Hashmap<String, Float> 
我想要获得的是自动序列化和反序列化这个类,而不必使用byte[]数组将测试类中的obj1和obj2保存到两个LongBlob字段中的MySQL表中,使用

Ebean.save(testClassInstance);
Ebean.find(Test.class, ID);
EDIT1:MyClass1的定义如下:

public class Test implements Serializable
{
    @Id
    private Long id;
    ...
    ...
    ...
    @Lob
    private MyClass1 obj1;
    @Lob
    private MyClass2 obj2;
    ...
    ...
    //getters and setters
}
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[]向量,而是有一个HashMap()。唯一值得注意的区别是serialize()和deserialize():

@覆盖
公共字节[]序列化()引发异常{
ByteArrayOutputStream outStream=新建ByteArrayOutputStream();
DataOutputStream out=新的DataOutputStream(扩展流);
out.writeInt(map.size());
迭代器迭代器=map.keySet().Iterator();
while(iterator.hasNext()){
String key=iterator.next();
out.writeUTF(键);
out.writeFloat(map.get(key));
}
返回outStream.toByteArray();
}
@凌驾
public void反序列化(字节[]字节)引发异常{
试一试{
ByteArrayInputStream inStream=新的ByteArrayInputStream(字节);
DataInputStream in=新的DataInputStream(流内);
this.map=新的HashMap();
int n=in.readInt();
对于(int i=0;i
实际上,没有必要包装
float[]
HashMap
,因为它们本身是可序列化的

另一件事是,如果
MyClass1
MyClass2
是可序列化的,那么就可以使用
@Lob
。根据,

默认情况下,JPA中的任何可序列化属性都不是 关系或基本类型(字符串、数字、时态、基元), 将序列化为BLOB字段

在那本维基百科中,还有一个例子是对类
图像
使用
@Lob

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

希望这能对您有所帮助。

在您回复后,我做了一些编码

条件:ClassB的字段应可序列化,字段的字段应可序列化,并且

B类:

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;
    }

}
A类:

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中添加任何逻辑,它可以正常工作。我对您重写序列化和反序列化有一个小问题。我想你没必要这么做。它将在序列化时默认完成。最后,这些代码确实像我尝试过的那样起作用


希望这对您有所帮助。

谢谢您的回复。实际上,我已经读过wikiboook,并且做了完全相同的事情:我用@Lob注释了我的MyClass1和MyClass2对象,但是当我执行Ebean.save(testInstance)时,除了这两个字段之外,所有字段都保存在db中。我需要包装那些float[]和HashMap,因为它们需要对它们执行一些特定的操作,这些操作需要创建两个类。@Andrea你能发布你的MyClass1和MyClass2吗?我修改了我的问题,将MyClass1和MyClass2定义包括在内(实际上大部分是这样)。我尝试了你的精确代码,但它不起作用。你能分享你的Eben.properties吗?Ebean不会在MySQL数据库中创建LOB列。您运行过示例代码吗?您使用了哪些组件?您使用的是哪个版本的Ebean库?完全没有错误,Ebean完全忽略了我的所有Lob,这些Lob不是字节[]。实际上我使用的是Hibernate。我想我清楚地说明了我使用的是Ebean,而不是Hibernate。。。你至少可以告诉我你在和Hibernate一起工作,这样我就不会花时间去想为什么我不能让它工作,但你是…我只是看了ORM,接下来的事情是当时我不知道Ebean。对不起。