使用Thrift进行离线序列化?

时间:2017-08-04 09:00:08

标签: java c# thrift

我使用Apache Thrift协议进行平板电脑服务器和中介语集成,几年都可以。

集成在语言之间(C#/ C ++ / PC Java / Dalvik Java),而thrift可能是最简单和最安全的。因此,我希望使用Thrift库进行pack-repack复杂的数据结构(并且经过多年的改变)。让我们用节俭的术语说出一些OfflineTransport或者OfflineProtocol。

场景:

我想制作备份解决方案,例如在离线模式下的互联网服务提供商失败过程数据中:序列化,存储,尝试以几种方式处理。例如,通过正常的电子邮件通过不良的备份连接等发送序列化数据。

问题是:在Thrift哲学中,哪里是我的最佳延伸点?

据我所知,只有部分在线协议可以离线备份,即无法实时返回值,即可。

2 个答案:

答案 0 :(得分:1)

寻找序列化器。有misc。实现,但它们都共享相同的通用概念,以使用缓冲区或文件/流作为传输介质:

用C#

编写数据

E.g。我们计划将这些位存储到bytes []缓冲区中。所以可以写:

var trans = new TMemoryBuffer();
var prot = new TCompactProtocol( trans);
var instance = GetMeSomeDataInstanceToSerialize();
instance.Write(prot);

现在我们可以掌握数据:

var data = trans.GetBuffer();

在C#中读取数据

阅读的工作方式类似,只是你需要从某个地方知道要构造的根实例:

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);

你可以尝试一下:https://github.com/endink/Thrifty