Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用Protobuf序列化任意对象_Java_Serialization_Protocol Buffers_Middleware - Fatal编程技术网

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

在Java中使用Protobuf序列化任意对象,java,serialization,protocol-buffers,middleware,Java,Serialization,Protocol Buffers,Middleware,我想使用protobuf在多个JVM之间提供通信。这些JVM正在执行一个基于组件的中间件,因此存在我无法预料的任意对象,因为它们是由第三方开发人员编写的。 问题是,我想让组件的开发人员摆脱指定序列化机制的负担。我认为这个决定有一些好处: 有些遗留组件是在没有考虑特定序列化机制的情况下编写的事实上,它们使用内置java序列化 如果通道管理消息的编码/解码,那么您可以连接任意一对组件 编写组件更容易。 但是,实现自动序列化的唯一方法是使用java内置序列化,但众所周知,这非常缓慢。所以,我的问题是:

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

有些遗留组件是在没有考虑特定序列化机制的情况下编写的事实上,它们使用内置java序列化 如果通道管理消息的编码/解码,那么您可以连接任意一对组件 编写组件更容易。 但是,实现自动序列化的唯一方法是使用java内置序列化,但众所周知,这非常缓慢。所以,我的问题是:我们能否创建一种机制,在给定Java对象的情况下,用它的内容构建一个protobuf消息,然后将其发送到另一个进程

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

如果类C的对象O从未被序列化,则转到步骤2;否则,我们已经有了一个消息类来序列化这个类,我们可以转到步骤7。 像内置序列化一样,使用类C上的反射构建原型规范。 使用protoc生成消息类 使用java编译器构建生成的类。 使用ASM动态生成用于字节码操作的类。这个类将把O转换成我们可以发送的消息。它还将执行相反的转换。 将为C类对象生成的所有类保存在缓存中 使用5中生成的类创建消息。 使用通道支持的任何机制发送消息,即套接字、共享内存 注1:您可以看到,我们在通信通道的一侧执行此操作,我们需要在两侧执行此操作。我认为,可以使用内置序列化发送第一条消息。使用第一个对象来构建protobuf消息,并使用protobuf进一步构建对象

注2:步骤5不是必需的,但在每次发送对象时避免反射非常有用

注3:Protobuf在这里不是强制性的。我之所以把它包括进来,是因为它可能提供了一些工具来解决我的问题


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

那么,您的基本问题是:是否存在一些库可以做到这一点?我说得对吗?据我所知,发送方和接收方需要相同或至少兼容的protobuf定义。如果发送方动态生成protobuf定义,接收方将如何获得该定义?@Bosko:主要问题是这个问题。@Kasoban:我可以使用[Self-Description messages][1]或发送带有内置序列化的第一条消息来在另一端构建相同的方案。[1]: