使用Java中的Protobuf序列化任意对象

时间:2014-05-05 14:34:41

标签: java serialization protocol-buffers middleware

我想使用protobuf在许多JVM之间提供通信。那些JVM正在执行基于组件的中间件,因此存在我无法预料的任意对象,因为它们是由第三方开发人员编写的。 问题是我想让组件开发人员免除指定序列化机制的负担。我认为这个决定有一些好处:

  1. 在没有考虑特定序列化机制的情况下编写遗留组件(事实上,它们使用内置的java序列化)
  2. 如果频道管理消息的编码/解码,那么您可以连接任何一对组件
  3. 编写组件更容易。
  4. 然而,进行自动序列化的唯一方法是使用java内置序列化,但我们都知道这很慢。所以,我的问题是:我们可以创建一个机制,给定一个Java对象,用它的内容构建一个protobuf消息,我们可以发送到另一个进程吗?

    我知道这不是你应该使用protobuf的方式,我可以看到一些问题。首先让我解释一下我认为我们可以实现自己的目标。

    1. 如果类(C)的对象(O)从未被序列化,请转到步骤2;否则,我们已经有一个消息类来序列化这个类,我们可以转到第7步。
    2. 使用C类反射构建原型规范,如内置序列化所做的那样。
    3. 使用protoc生成消息类
    4. 使用java编译器构建生成的类。
    5. 使用ASM动态生成类以进行字节码操作。该类将O转换为我们可以发送的消息。它也将进行相反的转变。
    6. 在缓存中保存为C类对象生成的所有类
    7. 使用5中生成的类创建消息。
    8. 使用通道支持的任何机制(即套接字,共享内存)发送消息
    9. 注1:您可以看到我们在通信渠道的一侧进行此操作,我们需要双方都这样做。我认为,可以使用内置序列化(使用第一个对象构建protobuf消息)发送第一个消息,并使用protobuf发送更多对象。

      注2:不需要步骤5,但每次发送对象时避免反射都很有用。

      注3:Protobuf不是强制性的。我包括它因为它可能提供了一些工具来处理我遇到的问题。

      我可以看到有很多工作要做。我也可以看到它可能在一些极端情况下不起作用。因此,我想知道是否已经建立了一些库并能够做到这一点?

0 个答案:

没有答案