【问题标题】:Dynamic Schema & Deserialization with Protostuff使用 Protostuff 进行动态模式和反序列化
【发布时间】:2015-10-15 16:56:26
【问题描述】:
我正在使用 Protostuff 尝试序列化/反序列化几种不同类型的对象,这些对象没有可用的 protobuf 源(这是服务器-服务器 RPC 场景)。序列化没问题,因为我知道要序列化的对象的类型并且可以创建模式:
Schema schema = RuntimeSchema.getSchema(object.getClass());
现在,我使用ProtobufIOUtil.toByteArray 并获取一个字节数组,然后将其传递给远程服务器。但是,我似乎无法在远程服务器中反序列化这个字节数组,因为我无法为“未知”类型的对象创建模式。有什么办法可以克服这个问题并像使用 Java 的本机序列化一样使用 Protostuff?
【问题讨论】:
标签:
serialization
deserialization
protostuff
【解决方案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 的类。