Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – Protobuf流(懒惰序列化)API大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个 Android应用程序,它使用Protocol Buffers来存储应用程序数据.数据格式(粗略地)是单个protobuf(“容器”),其包含作为重复字段的protobufs(“items”)列表: @H_607_5@ @H_607_5@
message Container {
    repeated Item item = 1;
}
@H_607_5@当我们想要保存对项目的更改时,我们必须重新创建protobuf容器,将所有项目添加到其中,然后将其序列化并将其写入文件.

@H_607_5@这种方法的问题是它可能使保存时使用的内存增加三倍,因为数据必须首先从模型类复制到protobuf构建器,然后在protobuf序列化时复制到字节数组,所有这些都在写入之前文件流.

@H_607_5@我们想要的是一种创建我们的protobuf容器并懒惰地将其序列化为流的方法,然后简单地将每个protobuf项(从我们的模型数据创建)添加到容器中,该容器将其序列化并将其写入流,而不是保留所有内存中的项目,直到我们在内存中创建了整个容器.

@H_607_5@有没有办法构建一个protobuf并将其懒洋洋地序列化为流?

@H_607_5@如果没有办法正式执行此操作,是否有任何库可以提供帮助?有没有人有任何建议或想法如何以其他方式解决这个问题?替代数据格式或技术(例如JSON或包含protobufs的XML)可以实现这一目标吗?

解决方法

对于序列化: @H_607_5@ @H_607_5@protobuf是一种可附加格式,其中合并了各个项目,并附加了重复的项目

@H_607_5@因此,要将序列编写为惰性流,您需要做的就是重复编写相同的结构,列表中只有一个项目:序列化200 x“Container with 1 Item”的序列与序列化1 x 100%相同“有200个项目的容器”.

@H_607_5@所以:就这样做!

@H_607_5@对于反序列化:

@H_607_5@从技术上讲,这很容易被视为一个流 – 然而,这一切都归结为您正在使用的库.例如,我在protobuf-net(一个.NET / C#实现)中将它暴露为serializer.DeserializeItems< T>,它基于它们所处的假设读取(完全延迟/流式传输)T类型的消息序列.您在问题中描述的表单(因此serializer.DeserializeItems< Item>将是替换serializer.Deserialize< Container>的流式方式 – 最外层的对象有点并不存在于protobuf中)

@H_607_5@如果这不可用,但您可以访问原始阅读器API,那么您需要做的是:

@H_607_5@>为标题读取一个varint – 这将是值10(0x0A),即分别为字段编号(1)和线型(2)的“(1 << 3)| 2” - 所以这也可以措辞:“从流中读取一个字节,并检查值是10”
>读取一个varint以获取以下项目的长度
>现在:

@H_607_5@>如果reader API允许您限制要处理的最大字节数,请使用此长度指定后面的长度
>或使用长度限制流包装流API,限制为该长度
>或者只是手动读取那么多字节,并从有效负载构造内存中的流

@H_607_5@>冲洗,重复

大佬总结

以上是大佬教程为你收集整理的android – Protobuf流(懒惰序列化)API全部内容,希望文章能够帮你解决android – Protobuf流(懒惰序列化)API所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。