BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Erik Bergstedt的工具库简化了在.NET中使用Protobuf的方式

| 作者 Jonathan Allen 关注 525 他的粉丝 ,译者 邵思华 关注 3 他的粉丝 发布于 2016年3月10日. 估计阅读时间: 3 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

Protobuf是由Google所创建的一种编码格式,它的正式名称叫做Protocol Buffers。这是一种紧凑的二进制格式,它牺牲了内容的可读性与可扩展性,换来了更小的空间占用与更好的性能。为了对某个Protobuf消息进行反序列化,客户端与服务端必须事先对消息中的特定字段达成一致。(与XML或JSON格式相反,客户端可以在运行时对后者的消息结构进行分析。)

.NET版本的Protobuf实现利用了属性的自定义attribute,为每个属性设置了一个“id”值。这些attribute将用于构建包含Protobuf消息的二进制数组。以下是Protobuf的一个应用示例:

[ProtoContract]
class Address
{
    [ProtoMember(1)]
    public string Line1 { get; set; }
    [ProtoMember(2)]
    public string Line2 { get; set; }
}

在C#中使用Protobuf的方式有些繁琐,因为开发者需要对流(stream)进行操作。而通过使用Erik Bergstedt所开发的Protobuffer库,只需一行代码就可以完成序列化或反序列化工作。

var serialize = _simpleSerializer.ToByteArray(GetPerson());
Person deserialize = _simpleDeserializer.FromByteArray<Person>(serialize);

开发者可能会感到疑惑,为什么不将这些API直接加入Protobuf项目中呢?Erik对此写道:

因为这个库的API是写死的,它隐藏了某些功能,这对于某些场景来说可能并不合适。它为了换取简便性而牺牲了某些功能。

举例来说,在这个库里对于流的创建方式是写死的,并且对GZIP的支持也超出了原始的protobuf的功能范围。

我们需要小心地区分特性与特性膨胀的区别。如果将这个库的功能添加至原始的protobuf项目中,我会认为它不是一种特性,而是一种特性膨胀。

Protobuffer是一个基于MIT协议的开源软件。而Protobuf工具本身是由Google所开发的,它支持多种平台与编程语言,包括C++、Java、JavaScript、Python和Ruby等等。

查看英文原文:Thanks to a Utility Library by Erik Bergstedt, Protobuf for .NET Just Got Easier

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT