我正在使用Protostuff来尝试序列化/反序列化几种不同类型的对象,这些对象没有可用的protobuf源(它是服务器 - 服务器RPC场景)。序列化没问题因为我知道要序列化的对象的类型并且可以创建模式:
Schema schema = RuntimeSchema.getSchema(object.getClass());
现在,我使用ProtobufIOUtil.toByteArray
并获取一个字节数组,然后将其传递给远程服务器。但是,我似乎无法在远程服务器中反序列化此字节数组,因为我无法为“未知”类型的对象创建模式。有没有什么办法可以解决这个问题并使用Protostuff,就像我使用Java的本机序列化一样?
答案 0 :(得分:1)
有一些常见的解决方案 - 将类的名称与数据一起序列化。
首先需要protostuff-runtime
。您应该使用一个Object
类型的字段创建包装类:
public class Wrapper {
public Object data;
}
然后将对象放到data
字段并序列化包装器,protostuff-runtime
会自动将类名附加到序列化表单,然后将其用于反序列化。
如果您想要更多控制权,那么您可以在没有protistuff-runtime
的情况下执行类似操作。
首先,您需要一个包装类:
public class Wrapper {
public String clazz;
public byte[] data;
}
然后你应该将数据序列化为字节数组,将其存储到包装器,然后序列化包装器实例。
在远程方面,您首先反序列化Wrapper
,然后获取clazz
字段 - 这是您应该用来反序列化data
的类。