hprose / hprose-java

Hprose is a cross-language RPC. This project is Hprose 2.0 for Java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ByteBufferStream是否需要close?

gwenson opened this issue · comments

ByteBufferStream究竟需不需要close?
ByteBufferStream怎么获取byte[]?是toArray()?还是 byteBufferStream.buff.array()?
还有能否给API加点注释吗?

还有一个问题是:我用

List<StraightCoord> data = 
ByteBufferStream serialize = HproseFormatter.serialize(data);
byte[] value = serialize.toArray();

把value存到redis,
服务重启后在把redis的value值反序列化

List<StraightCoord> unserialize = (List<StraightCoord>) HproseFormatter.unserialize(value);

就提示:hprose.util.LinkedCaseInsensitiveMap cannot be cast to dto.StraightCoord
请问这是怎么回事?

因为你可以把 ByteBufferStream 里面的 Buffer 直接拿出来用,当你拿出来用之后,就不能 close 了,close 的话,会把 Buffer 放会池中被重用,到时候会跟你拿出来用的 Buffer 冲突。如果你只是 toArray() 了,并没有直接使用其中的 Buffer,那么你就可以放心的 close 了。其实就算不 close,也不过是不把 Buffer 所引用的 byte[] 放回到池中,它会随着 ByteBufferStream 对象被回收一同被回收。

反序列化时,你的 StraightCoord 类型没有注册,所以它找不到这个类,就会按照 Map 序列化了,而 Map 并不能转换为你定义的 StraightCoord 类型,所以会报错。你反序列化之前,先注册一下这个类型就可以了。

怎么注册?

HproseClassManager.register(StraightCoord.class, "StraightCoord");

这样吗?

嗯,对,序列化和反序列化前都写上。