我在Thrift
中定义了一组结构。从概念上讲,这些结构中的一些是公共父类的子类。由于Thrift
不支持结构继承,因此我使用以下策略来定义结构:
说A
和B
是父type P
的子类型。以下是我的节俭定义来表示:
struct P {
1: i32 childType,
2: list<byte> payload
}
struct A {
1: i32 x
}
struct B {
1: i32 y
}
type A and B
的对象被序列化为type P
的记录(payload
字段将存储对象的序列化版本,childType
的值将指示是否序列化有效载荷为type A or B
)。在反序列化期间,childType
字段的值将指示payload
需要如何反序列化。
但是,在使用Java或Scala等面向对象语言编写代码时,这种方法会带来困难。例如,在返回type P
对象的函数中,我无法返回type A
或type B
的结果。
(i)是否有建议的方法来处理这个问题?也就是说,如何将Thrift
中缺少继承与使用继承的Java/Scala
代码进行协调?
提前致谢。
答案 0 :(得分:0)
我无法判断Java / Scala是否有更好的方法,但在我们的例子中,添加一个指向其“超级”Thrift结构的额外Thrift结构成员可以实现我们想要的。
struct Foo {
1: i32 wtf
}
struct Bar {
1 : Foo super_
2 : double moredata
}
当然,这只是一种解决方法,但我们可以忍受。
答案 1 :(得分:0)
另一种解决方法是使用节俭联盟,尽管对节俭的联盟支持(至少在某些语言中)并不是很好。请参阅docs。
我正在改变你的样本(B.y现在是字符串)给出一个更好的例子。考虑这个节俭文件:
struct A {
1: i32 x
}
struct B {
1: string y
}
union P {
1: A a,
2: B b
}
在thrift编译器0.9.0生成的Java代码中,P类有多种方法可用于确定P是否包含A或B:isSetA
/ isSetB
,getA
/ getB
和getSetField
返回指定类型的枚举。