使用自定义对象属性序列化java类
我想使用ebeanorm在MySQL数据库上序列化一个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
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@覆盖
公共字节[]序列化()引发异常{
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。对不起。