gpt4 book ai didi

java - 如何在 SpringData MongoDb Java bean 中映射二进制数据?

转载 作者:行者123 更新时间:2023-12-02 04:26:29 24 4
gpt4 key购买 nike

我有一个 bean,其中包含一个 Java 对象,该对象作为二进制数据存储在 Mongo DB 中。引入 SpringData 进行映射给了我这个问题。所以,Bean代码是:

@Document(collection = “cache”)
public class CacheBean {
...
private Object objectData;
...
}

Mongo Db 的插入代码是:

protected void setToMongo(String key, Object value){
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(value);
CacheBean cacheBean = new CacheBean();
cacheBean.setObjectData(getBytesForObject(o));
mongoTemplate.save(cacheBean);
}
private byte[] getBytesForObject(Object o) throws IOException{
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(b);
os.writeObject(o);
return b.toByteArray();
}

提取代码如下:

Object resultObject = cacheBean.getObjectData();
org.bson.types.Binary result = (Binary) resultObject;
ByteArrayInputStream b = new ByteArrayInputStream(result.getData());
ObjectInputStream o = new ObjectInputStream(b);
return o.readObject();

我在线上遇到异常

org.bson.types.Binary result = (Binary) resultObject:

java.lang.ClassCastException: [B 无法转换为 org.bson.types.Binary

最佳答案

MongoDB 隐式地将(我认为)字节数组存储为 Bson BinData。

请注意,您自己将 objectData 设置为字节数组:

cacheBean.setObjectData(getBytesForObject(o));

此时 private Object objectData; 的类型为 byte[]

因此,没有什么可以阻止您在 CacheBean 中声明这一点:

private byte[] objectData;

因此...

ByteArrayInputStream b = new ByteArrayInputStream(cacheBean.getObjectData());
ObjectInputStream o = new ObjectInputStream(b);
return o.readObject();

为了方便起见,您可能还希望将对象类存储为字段。

关于java - 如何在 SpringData MongoDb Java bean 中映射二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080593/

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