我有一个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
答案 0 :(得分:2)
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();
为方便起见,您可能还希望将对象类存储为字段。