gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:38:31 25 4
gpt4 key购买 nike

我想使用 Ebean ORM 在我的 MySQL 数据库上序列化一个 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> 

并且都实现了Serializable接口(interface)。

我不想创建一个类:

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

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

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

EDIT1: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,只是我有一个 HashMap < String, Float > () 而不是 float[] vector 。唯一值得注意的区别是 serialize() 和 deserialize():

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

最佳答案

其实没必要把float[]包裹起来和 HashMap<String,float>因为它们本身是可序列化的。

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

By default in JPA any Serializable attribute that is not a relationship or a basic type (String, Number, temporal, primitive), will be serialized to a BLOB field.

在那本 wikibook 中,还有一个使用 @Lob 的示例上课 Image .

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

希望这对你有帮助。

关于java - 使用自定义对象属性序列化 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com