【问题标题】: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 的类。

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多