Tag: protobuf net

对于哪些情况,protobuf-net不合适?

我们一直在使用BinarySerialization和我们的C#app,但是需要序列化的类的大小和复杂性导致了sloooooow(de)序列化和大文件。 我们怀疑我们应该编写自己的自定义序列化程序; 但是protobuf-net声称比标准的.Net二进制序列化具有显着的速度和大小优势,并且可能比大量的定制序列化器更容易添加到我们的应用程序中。 在花费大量时间和精力试图让它为我们工作之前,我很想知道是否有任何交易破坏者。 我们正在使用通过接口定义的属性,抽象子类的通用列表,自定义位标志枚举等等。什么会阻止protobuf-net为我们工作?

Protobuf-net创建具有接口和抽象基类的类型模型

我正在尝试使用伟大的Protobuf-NET序列化模型。 我不能使用属性(对象在编译时是未知的),所以我构造了一个TypeModel。 我的对象模型由一个类TestDataObject组成 ,该类具有ITestDataExtension属性。 抽象基类TestDataExtensionBase实现此接口,类TestDataExtension (代码中的myDataObjectExtA)inheritance自此基类。 我的TypeModel构造如下: System.IO.MemoryStream tmpMemoryStream = new System.IO.MemoryStream(); RuntimeTypeModel model = TypeModel.Create(); MetaType basetype = model.Add(typeof(TestDataObject), true); MetaType interfaceType = model.Add(typeof(ITestDataExtension), true); //MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase)); MetaType extType = interfaceType.AddSubType(200, myDataObjectExtA.GetType()); model.Add(typeof(TestDataExtensionBase), true); model.Add(myDataObjectA.Ext.GetType(), true); model.CompileInPlace(); model.Serialize(tmpMemoryStream, myDataObjectA); byte[] tmpDat = tmpMemoryStream.ToArray(); 如果我运行以下命令,基类的属性不会被序列化,我需要序列化它们。 在我看来,我应该为TestDataExtensionBase添加一个子类型,如下所示: MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase)); MetaType […]

使用Dictionary的Protobuf-net对象引用反序列化:在反序列化期间引用跟踪对象更改了引用

我在使用protobuf-net尝试序列化/反序列化复杂对象图时遇到了一些问题。 我正在研究遗留应用程序,我们正在使用.Net Remoting将GUI客户端连接到C#服务。 由于使用默认BinaryFormatter对象图的序列化大小,我们看到海外用户的性能不佳,客户端和服务器之间的有限带宽(1Mbit / s)加剧了这种情况。 作为一个快速的胜利,我想我已经整理了一个概念certificate,通过使用protobuf-net代替,通过实现ISerializable来确定是否有任何性能提升。 在我测试时,我遇到了一个问题,即没有维护对象引用。 我汇总了一个重新解决问题的例子。 我希望Dictionary (Items [1])中的对象和对象BA与我在ProtoMember属性中指定的AsReference=true相同。 使用protobuf-net 2.0.0.619 ,我看到反序列化时引发exception(反序列化过程中引用跟踪对象更改了引用)。 如果这不是支持的方案,请告诉我。 测试 [Test] public void AreObjectReferencesSameAfterDeserialization() { A a = new A(); B b = new B(); bA = a; b.Items.Add(1, a); Assert.AreSame(a, bA); Assert.AreSame(bA, b.Items[1]); B deserializedB; using (var stream = new MemoryStream()) { Serializer.Serialize(stream, b); stream.Seek(0, SeekOrigin.Begin); deserializedB […]

使用protobuf-net进行质量过滤

我用protobuf-net序列化了一个对象列表。 从理论上讲,.bin文件可以包含数百万个对象。 假设对象属于包含以下内容的类: public string EventName; 我必须进行查询并创建一个包含与查询匹配的对象的列表。 使用LINQ从序列化文件中提取匹配对象的正确方法是什么?

使用protobuf-net,是否可以在不分配内存的情况下反序列化消息?

我有一个C#应用程序,需要每秒反序列化数千个protobuf消息。 为了避免不必要的垃圾收集,我想知道是否有办法使用预先分配的内存,这样每个反序列化操作都不需要分配新的内存。 我设想的是,我会在执行之前分配一个消息对象池,然后指示protobuf代码使用此池中的下一个可用消息进行每个反序列化。 此function是否存在,或者是否有其他方法可以优化此方案中的内存使用? 谢谢!

如何从使用属性修饰的C#类生成.proto文件?

试图让我的思绪围绕谷歌protobuf。 我在C#中发现了一些protobuf的实现,但它们似乎缺少一个function:能够从使用属性修饰的现有C#类自动生成.proto文件。 我想这样做而不是从.proto文件中自动生成的C#类的原因是因为我已经在我的项目中定义了C#类,我不想复制它们只是为了满足ProtoBuf。 有没有人遇到过这种情况? 更新 这可能只是装饰一个C#类而不是使用.proto文件来使用protobuf吗?

开始使用protobuf-net

我正在尝试开始使用protobuf.net。 我从这里下载了最新版本,实现了[ProtoContract]类,现在我正在尝试使用ProtoBuf.Serializer.Serialize将其序列化,如文档中所述。 问题是,没有这样的方法。 如何将[ProtoContract]写入磁盘? 更新显然,我有错误的版本或东西,但这是我的Serialize类的样子:

使用protobuf-net的C#项目中的协议缓冲区 – 代码生成的最佳实践

我正在尝试使用protobuf-net在C#项目中使用protobuf,并且想知道将这个组织到Visual Studio项目结构中的最佳方法是什么。 当手动使用protogen工具生成C#代码时,生活似乎很容易,但感觉不对。 我希望.proto文件被认为是主要的源代码文件,生成C#文件作为副产品,但在C#编译器参与之前。 选项似乎是: 原型工具的自定义工具(虽然我看不到从哪里开始) 预构建步骤(调用protogen或批处理文件,这样做) 我一直在努力2)因为它一直给我“系统找不到指定的文件”,除非我使用绝对路径(我不喜欢强制项目明确定位)。 还有一个约定吗? 编辑:根据@ jon的评论,我重新尝试了预构建步骤方法,并使用Google的地址簿示例使用了这个(protogen的位置现在硬编码): c:\bin\protobuf\protogen “-i:$(ProjectDir)AddressBook.proto” “-o:$(ProjectDir)AddressBook.cs” -t:c:\bin\protobuf\csharp.xslt 编辑2:考虑到@ jon的建议,如果它们没有改变就不通过处理.proto文件来最小化构建时间,我已经敲了一个基本工具来检查我(这可能会扩展到一个完整的自定义构建工具): using System; using System.Diagnostics; using System.IO; namespace PreBuildChecker { public class Checker { static int Main(string[] args) { try { Check(args); return 0; } catch (Exception e) { Console.WriteLine(e.Message); return 1; } } public static void Check(string[] args) […]

如何让protobuf-net在.Net中压缩和取消inheritance的类?

这是我之前的一个后续问题, 如何让protobuf-net和protostuff相互支持.Net和Java中的inheritance类? 正如那里所解释的那样,我正在Windows系统上现有的基于.Net的程序与我为Android设备创建的新程序之间进行通信。 在.Net端,我正在使用Marc Gravell的伟大的protobuf-net程序,而在Android端,我正在使用David Yu的伟大的protostuff程序。 我正在使用我的(大部分已经存在的)C#类作为“定义类”,并且通过生成的.proto文件,我正在创建相应的Java类。 事情进展得很顺利,除了我遇到的问题是我的许多C#类都是从其他类inheritance的,通常深度为3或4或更多。 在另一个问题中,我曾建议尝试在Java类中复制此inheritance结构。 我现在已经改变了主意,并且更喜欢更简单的东西,而且只需要更改.Net的交易结束。 以下是我的一些C#类(简化): public /* abstract */ class ProgramInfoBase { private string _programName; private string _programVersion; [ProtoMember(1)] public string ProgramName { get { return _programName; } set { _programName = value; } } [ProtoMember(2)] public string ProgramVersion { get { return _programVersion; } set { _programVersion = […]

在一个程序集中序列化,在另一个程序集中反序列化?

我在两个项目中有相同的类,一个在runtime被发送到另一个进程,该进程必须反序列化该对象并使用它(假设两个对象相同但程序集名称不同,因此它们实际上被解释为两个不同种类)。 根据我的研究,我得出的解决方案由于以下原因而无效。 Json.NET :给我一个例外,即两种类型不兼容(尝试在序列化设置中使用typename.all)。 protobuf-net :要求我在每个地方添加属性或者只是为它提供属性名称(在v2中),由于我的对象太复杂,这对我来说都是不可能的。 BinaryFormatter :与protobuf->吨属性相同的原因。 Use Common Assembly :由于某些与我的项目架构相关的原因,我不能。 那么是否有任何简单的方法来序列化一种类型,然后将其反序列化为另一种类型(实际上是同一个类但在不同的程序集中)?