我使用Apache Thrift协议进行平板电脑服务器和中介语集成,几年都可以。
集成在语言之间(C#/ C ++ / PC Java / Dalvik Java),而thrift可能是最简单和最安全的。因此,我希望使用Thrift库进行pack-repack复杂的数据结构(并且经过多年的改变)。让我们用节俭的术语说出一些OfflineTransport或者OfflineProtocol。
场景:
我想制作备份解决方案,例如在离线模式下的互联网服务提供商失败过程数据中:序列化,存储,尝试以几种方式处理。例如,通过正常的电子邮件通过不良的备份连接等发送序列化数据。
问题是:在Thrift哲学中,哪里是我的最佳延伸点?
据我所知,只有部分在线协议可以离线备份,即无法实时返回值,即可。
答案 0 :(得分:1)
寻找序列化器。有misc。实现,但它们都共享相同的通用概念,以使用缓冲区或文件/流作为传输介质:
E.g。我们计划将这些位存储到bytes []缓冲区中。所以可以写:
var trans = new TMemoryBuffer();
var prot = new TCompactProtocol( trans);
var instance = GetMeSomeDataInstanceToSerialize();
instance.Write(prot);
现在我们可以掌握数据:
var data = trans.GetBuffer();
阅读的工作方式类似,只是你需要从某个地方知道要构造的根实例:
var trans = new TMemoryBuffer( serializedBytes);
var prot = new TCompactProtocol( trans);
var instance = new MyCoolClass();
instance.Read(prot);
加载过程中鸡蛋问题的一个解决方案是使用union
作为额外的序列化容器:
union GenericFileDataContainer {
1 : MyCoolClass coolclass;
2 : FooBar foobar
// more to come later
}
通过在序列化期间始终使用此容器作为根实例,可以轻松添加更多类而不会破坏兼容性,并且无需事先知道文件中的确切内容 - 您只需阅读它并检查哪个元素在联盟中设置。
答案 1 :(得分:0)
有一个RPC框架使用名为" thrifty"的标准thrift协议,它与使用thrift IDL定义服务的效果相同,也就是说,thrify可以与使用的代码兼容thrift IDL,这对跨平台很有帮助。并且有一个ThriftSerializer类:
[ThriftStruct]
public class LogEntry
{
[ThriftConstructor]
public LogEntry([ThriftField(1)]String category, [ThriftField(2)]String message)
{
this.Category = category;
this.Message = message;
}
[ThriftField(1)]
public String Category { get; }
[ThriftField(2)]
public String Message { get; }
}
ThriftSerializer s = new ThriftSerializer(ThriftSerializer.SerializeProtocol.Binary);
byte[] s = s.Serialize<LogEntry>();
s.Deserialize<LogEntry>(s);