java - 如何发送未在 Thrift 中定义结构的 Java 对象

标签 java serialization deserialization thrift

是否有一种方法可以通过 thrift 将未在 thrift 文件中定义的 Java 对象作为结构从一个 java 应用程序发送到另一个 java 应用程序。 问题是我们使用的外部库有自己的域模型,我们需要通过 thrift 发送这些模型,那么有什么技术可以做到这一点吗?

热烈欢迎任何建议。

更新#1

下面的答案正确解释了可能的解决方案,目前我们正在考虑创建自己的域模型来镜像外部库类(它足够小,可以付出这样的努力)

最佳答案

将序列化实体交换为二进制数据

这是一个简单的三步过程:

  1. 序列化数据,例如到 ByteBuffer 或类似的
  2. 通过 Thrift 接口(interface)以二进制的方式发送该数据
  3. 将接收到的字节反序列化为 Java 实体

服务可以很简单

service MyCoolService {
   binary Foobar( 1: binary javaBytes)
}

警告一句话

值得一提的是,这打破了 Thrift 所代表的跨语言系统的整体理念。您的二进制数据只能被 Java 程序理解。你被警告了。但另一方面,如果您的用例是这样的,API 仅在内部使用,这方面不会成为问题,这是一个合法的解决方案。

替代解决方案

另一个解决方案可能是使用 Thrift IDL 镜像域模型。当领域模型很小和/或不经常改变时,这可能是一个解决方案。好处是您获得了交叉互操作性,但您付出了额外的复杂性和一点性能的代价(在某些地方,数据必须以某种方式从一种模型转换为另一种模型)。

但是,如果领域模型具有一定的复杂性,这就会变得很麻烦。

组合解决方案

当然,您也可以结合使用这两个选项,例如通过MultiplexTransport :

// the efficient, but Java-only way outlined at the beginning
service MyCoolJavaService {
   binary Foo( 1: binary javaBytes)
}

// miror-model solution

struct EntityOne { ... whatever you need ... }
struct OtherEntity { ... whatever you need ... }
struct ThirdEntity { ... whatever you need ... }

service MyCoolModelService {
   EntityOne Foo( 1: ThirdEntity foo, 2: OtherEntity bar)
}

关于java - 如何发送未在 Thrift 中定义结构的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600040/

相关文章:

java - 带 Spring Boot 的 Jackson : control object substitution for specific method

c# - 如何将类似结构的 php 数组传递给 soap 客户端?

c++ - 无法在 Dlib 中序列化学习函数

java - 当值为 "null"时,Jackson 忽略自定义字段反序列化器

java - 优雅地停止由 maven-antrun-plugin 启动的 java 进程

java - 多个列表之间的公共(public)元素

java - 如何使用 Spring WebClient 反序列化通用响应

c# - 如何在 C# .NET 中反序列化复杂的 JSON 对象?

java - Htmlunit Javascript 按钮/链接

java - 如何确保多个 Guava 缓存不互相锁定?