profobufjs——初步学习

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

首先用一幅图来指出protobuf在显示不同方法之间的关系以及有效消息的概念:在这里暂时不需要理解,后面我们会一点一点解释。重点重点

主要注意的是,我们在介绍各个不同的方法的时候,Message指的是一个任意的消息类:

为了说明问题,我的demo代码用浏览器端的代码来演示:

<!doctype html>
<head>
	<style>
	</style>
	<script src="js/protobuf.js"></script>
</head>

<body>
<script>
	var jsonDescriptor = {
	  "nested": {
		"awesomepackage": {
		  "nested": {
			"AwesomeMessage": {
			  "fields": {
				"awesomeField": {
				  "type": "string",
				  "id": 1
				}
			  }
			}
		  }
		}
	  }
	};
	var root = protobuf.Root.fromJSON(jsonDescriptor);
	console.log('root:',root);
	// Obtain a message type
    var AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");
	console.log('AwesomeMessage :',AwesomeMessage);
    // Exemplary payload
    var payload = { awesomeField: "AwesomeString" };

    // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
    var errMsg = AwesomeMessage.verify(payload);
    if (errMsg)
        throw Error(errMsg);

    // Create a new message
    var message = AwesomeMessage.create(payload); // or use .fromObject if conversion is necessary
	console.log('message :',message);

    // Encode a message to an Uint8Array (browser) or Buffer (node)
    var buffer = AwesomeMessage.encode(message).finish();
	console.log('buffer :',buffer);
    // ... do something with buffer

    // Decode an Uint8Array (browser) or Buffer (node) to a message
    var message = AwesomeMessage.decode(buffer);
	console.log('decode message :',message);
    // ... do something with message

    // If the application uses length-delimited buffers, there is also encodeDelimited and decodeDelimited.

    // Maybe convert the message back to a plain object
    var object = AwesomeMessage.toObject(message, {
        longs: String,
        enums: String,
        bytes: String,
        // see ConversionOptions
    });
	console.log('origin object :',object);
</script>
</body>
</html>

这段代码的简单输出如下:

我们首先看这一部分,这一部分用JSON对象描述符来初始化root实例:

protobuf.Root.fromJSON(descriptor)

var root = protobuf.Root.fromJSON(jsonDescriptor);
console.log('root:',root);

可以看到我们的消息AwesomeMessage已经实例化好了,而且这个类型包含了一些基本的方法,比如:encode,

decode,fromObject,toObject,verify。这些方法和我们最上面图展示的方法是不是很类似。

Message.verify(payload)

我们先来看Message.verify(payload)

我们的代码首先通过var AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");获得自己定义的消息类型。然后创建一个消息,最后调用var errMsg = AwesomeMessage.verify(payload);注意,如果这里的消息有问题,比如多了一个字段,或者字段类型不正确,则会返回具体的错误信息,这样可以验证这个消息是不合法的。

 

Message.create(object)和Message.encode(message)

我们再来看Message.create(object)

我们的代码使用var message = AwesomeMessage.create(payload);创建了一个消息对象实例,然后调用var buffer = AwesomeMessage.encode(message).finish();实现了消息到Uint8Array的转化。如下图所示:

Message.decode(buffer)和Message.toObject(message)

我们通过调用var message = AwesomeMessage.decode(buffer);将buffer转化为了具体的消息实例(AwesomeMessage),以及

var object = AwesomeMessage.toObject(message, {
    longs: String,
    enums: String,
    bytes: String,
    // see ConversionOptions
});

这段代码最后将消息对象转化为具体的Object对象。

以上就是一个protobuf从编码到解码的一个完整的流程,不难看出,这个流程还是比较清晰的,不过这里给大家伙留下了一个疑问?

为什么要采用这种编码和解码的方式呢?或者说它的优势和劣势是什么呢?

 

版权声明:著作权归作者所有。

相关推荐

JavaScript ES 2017: 通过示例学习Async/Await

预备知识ES 2017新增了Asynchronous函数。 在JavaScript中,Async函数本质上是一种处理异步代码的比较简洁的方法。 为了理解这些是什么,以及它们是如何工作的,我们首先需要了解Promise。如果你不知道Promise是什么,那么你应该先阅读我发表的关于Promise的这篇文章。 在理解Promise之前,你是不会理解JavaScr

[译]5分钟内学习CSS变量

CSS自定义属性(也称为变量)对于前端开发人员来说是一个巨大的胜利。 它将变量的强大功能引入CSS,从而减少重复,代码更可读以及更灵活。另外,与CSS预处理器的变量不同,CSS变量实际上是DOM的一部分,它是有很多好处。 所以他们基本上像SASS和LESS的变量。 在这篇文章中,我会给你一个关于这种新技术如何工作的速成课程。我还创建了一个免费的关于CSS变量的课程,它

GPU架构学习资源

这里收藏了gpu学习的网站,pdf等等资源:http://courses.cms.caltech.edu/cs179/http://www.amd.com/Documents/GCN_Architecture_whitepaper.pdfhttps://community.arm.com/graphics/b/bloghttp://cdn.imgtec.com/sdk-documentation/

[译]5分钟学习React.js

本教程将通过构建一个非常简单的应用程序,让你对React.js有基本的了解。我会抛弃所有我认为不是核心的东西。如果你喜欢我的教学风格,在我们即将推出免费的React.js课程时你想收到通知,可以在此留下电子邮件。设置在开始使用React时,你应该使用最简单的设置:在html文件中使用script标签导入React和ReactDOM库,如下所示:<html><head><

thenjs 学习

thenjs 是一个js的异步控制流程库 特点 可以像标准的Promise那样,把N多异步回调函数写成一个长长的then链,并且比Promise更简洁自然。因为使用标准Promise的then链,其中的异步函数都必须转换成Promise,Thenjs则无需转换,像使用CallBack一样执行异步函数即可。 强大的Error机制,可以捕捉任何同步和异步的异步错误。 开启debug模式

JPA实体状态学习-(瞬时态:Transient)

为了学习实体的状态,我们还是贴出这张实体状态转换迁移图:Transient(瞬时态)按照上图的描述,java对象在内存中被赋值后,没有调用entityManager.persist()方法之前实体对象所处的状态就是瞬時態举个例子:Teacher teacher = new Teacher("email@dot.com");此时,实例teacher就处于new/transient态(备注:这里的ne

JPA实体状态学习-(持久态:Persistent)

今天我们继续学习JPA的实体状态转化,老规矩贴上实体转化的转化图: 上一节我们学习了:entityManager调用persist()方法后,实体的状态从transient到persistent,这个时候对persistent状态的实体改变也会同步持久化到数据库,执行tx.commit()之后实体进入detached状态,此时对实体进行改变后不会同步到数据库。今天我们来看看transie

JPA实体状态学习-(游离态:Detached)

今天我们学习另一种实体状态,老规矩还是先上图:Detached(游离态 unmanaged)An Object becomes detached when the currently running Persistence Context is closed. Any changes made to detached objects are no longer automatically prop

初步理解RxJs

         学习是一个由浅入深的过程,如果能够理解并掌握二八原则(帕累托法则),那么我们对知识的学习定会事半功倍,甚至事半多倍。对基础知识的理解决定了对知识理解的深度。RxJs定义        RxJS是ReactiveX在JavaScript上的一个派生。ReactiveX是一个应用比较广泛的响应式

getBoundingClientRect(学习)

最近在学习CK5的时候,学习到了一个Rect的类,这个类主要提供盒子元素定位时候用到的一些值,比如top、left、right、bottom、width、height。而它的实现主要用到了两个方法,其中一个就是:Element.getBoundingClientRect()Element.getBoundingClientRect() 方法返回一个 DOMRect 对象,该对象提供有关元素大小及其