Tag: protobuf net

protobuf.net意外的子类型

我在使用Protobuf.net的项目中遇到此exception: InvalidOperationException “Unexpected sub-type: foo” 我有一个我要发送的类,如下所示: class message { list listOfBars; } fooinheritance了bar,但是protobuf似乎对此产生了阻碍并产生了上面的exception。 这有什么办法吗? 我需要能够在列表中保存所有不同的bar子类型,因此更难以/不可能采用更多类型约束的解决方案。

Protobuf.netexception – 检查元数据时超时

尝试使用protobuf.net反序列化对象时, 有时会收到以下exception。 我很惊讶,因为我从来没有多个线程同时反序列化同一个对象,并且protobuf.net源似乎没有使用任何静态对象进行反序列化。 exception确实提出了一个解决方案,但我不确定如何实现,所以欢迎一个例子。 Base Exception Type: System.TimeoutException: Timeout while inspecting metadata; this may indicate a deadlock. This can often be avoided by preparing necessary serializers during application initialization, rather than allowing multiple threads to perform the initial metadata inspection at ProtoBuf.Meta.RuntimeTypeModel.TakeLock(Boolean& lockTaken) at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled) at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, […]

是否可以将Protobuf-Net与没有无参数构造函数的类一起使用?

使用Protobuf-Net,我发现如果没有无参数构造函数或者我可能会遗漏某些东西,似乎无法反序列化一个类? 我不想要一些带有无参数构造函数的类。 我可以使用某种属性或其他技术吗?

protobuf-csharp-port – 从LINQ-to-XML中的一个类似于轴函数的文件中流式传输记录

我已经构建了protobuf-csharp-port附带的标准地址簿教程,我的代码如下: class Program { static void Main(string[] args) { CreateData(); ShowData(); } private static void CreateData() { AddressBook.Builder abb = new AddressBook.Builder(); for (int i = 0; i < 2000000; i++) { Person.Builder pb = new Person.Builder(); pb.Id = i; pb.Email = "mytest@thisisatest.com"; pb.Name = "John" + i; abb.AddPerson(pb.Build()); } var ab = abb.Build(); var […]

使用protobuf-net发布反序列化(protocolBuffer)序列化数据

我使用protobuf-net对数据进行了序列化,并且能够在C#中进行相同的处理。 放一个C#dummy w# var file = File.Create(“animal.bin”); //Creating Msg – Fill the Data animal.id = “1”; animal.Name = “Rat”; animal.host = “Cheetha”; ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1); animal.id = “2”; animal.Name = “Cat”; animal.host = “Cheetha”; ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1); …. animal.id = “4”; animal.name = “Cheetha”; animal.host = “Cheetha”; ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1); //Done Creating […]

序列化动态类型参数Protobuf-net

可能没有答案的重复: 这里和这里 。 我正在尝试使用protobuf-net(2.0.0.668)序列化带有params对象数组的类。 我的params对象[]中可以有不同的类型。 使用DataContractSerializer时,只需使用[KnownType]即可。 据我所知,protobuf-net并非如此,我必须使用[ProtoInclude] ,以及DynamicType = true ,如下所示: [ProtoContract, ProtoInclude(20, typeof(Int32))] //Int32 as an example public class MyParams { public MyParams(){} public MyParams( string name, params object[] parms) { this.Name = name; this.Parms = parms; } [ProtoMember(1)] public string Name { get; set; } [ProtoMember(2, DynamicType = true)] public object[] Parms { […]

protobuf-netinheritance和字段编号

我正在尝试为我们的应用程序构建一个必须能够处理inheritance的序列化系统。 更复杂的是,应用程序是可扩展的,因此在编译时很可能不知道类型。 我已经阅读了之前的一个stackoverflow问题 ,这个问题得到了回答,并且帮助我完成了我的目标,但是我遇到了一个绊脚石,可能比任何真正的问题更缺乏理解! 所以这是我目前的代码…… public interface IBaseFrame { } public class BasicDataFrame : IBaseFrame { } public class AnotherFrame : BasicDataFrame { } 。 。 。 。 RuntimeTypeModel model = TypeModel.Create(); MetaType baseType = model.Add(typeof(IBaseFrame), true); MetaType basicFrameType = model.Add(typeof(BasicDataFrame),true); baseType.AddSubType(7, typeof(BasicDataFrame)); model.Add(typeof(AnotherFrame), true); basicFrameType.AddSubType(8, typeof(AnotherFrame)); 现在这段代码正常工作(据我所知!)并且世界上一切都很好……我关心的是在上面的代码中使用值7和8来获取AddSubType方法的fieldNumber参数。 由于插件是枚举的,我正在使用SerialisationManager注册它们的帧类型,然后我将它们添加到模型中,并使用fieldNumber的递增计数器(我以任意大的数字启动它,所以我不必担心扩展基类在将来)。 我担心如果插件以不同的顺序枚举或添加(或删除)新插件,则自动生成的fieldNumber将针对不同的子类型不同,这将导致用户之间共享日志文件的问题(谁当插件可能已被删除时,可能在同一系统上有不同的插件,因此可能有子类型或甚至文件。 是否有任何狡猾的方法可以自动处理这种inheritance,并且未来不会引入兼容性问题,或者当插件发生变化时,或者我是否需要提出一种机制,可以保证这些fieldNumbers能够在所有安装中保持不变? 任何可以提供的帮助或建议将不胜感激!

是否可以使用协议缓冲区序列化System.Object对象列表

我有各种数据类型的对象列表(DateTime,int,decimal,string)。 List myObjects = new List(); myObjects.Add(3); myObjects.Add(3.9m); myObjects.Add(DateTime.Now); myObjects.Add(“HELLO”); 我能够使用protobuf-net序列化此列表,但反序列化总是抛出exception:“附加信息:不期望类型,也不能推断出合同:System.Object”。 using (var ms = new MemoryStream()) { Serializer.Serialize(ms, list2); var bytes = ms.ToArray(); ms.Position = 0; var clone = Serializer.Deserialize(typeof(List), ms); //Throws exception } 我没有任何明确的合同,我想这是问题所在? 但是,我确实知道序列化对象的预期类型是什么,但我如何告诉protobuf-net?

序列化和发送协议缓冲消息

我在c#中写了这个protobuf消息 C#客户端: public AddressBook InitializeAdressBook() { Person newContact = new Person(); AddressBook addressBookBuilder = new AddressBook(); Person john = new Person(); john.id=1234; john.name=”John Doe”; john.email=”jdoe@example.com”; Person.PhoneNumber nr = new Person.PhoneNumber(); nr.number=”5554321″; john.phone.Add(nr); addressBookBuilder.person.Add(john); TextBox.Text += (“Client: Initialisiert? ” + addressBookBuilder.ToString()) + “\t” + “\n”; TextBox.Text += ” Erster Person ” + addressBookBuilder.person.First().name + “\t” + […]

具有扩展的协议缓冲区

我可能忽略了一些东西,但我正在尝试将协议缓冲区转换为一种简单的方法,以便稍后提供扩展。 这似乎有点不清楚,所以我会直接跳到这个问题。 我正在编写一个程序集来支持各种任务,其中一个任务包括描述结构化数据。 使用协议缓冲区的最佳时机。 使用协议缓冲区的主类称为StateDefinition。 这是我为它提出的.proto文件: 包Kannon.State; 消息StateDefinition { 枚举StateTypes { GRAPHICS = 0; AUDIO = 1; MIND = 2; 物理= 3; NETWORK = 4; GENERIC = 5; } 重复StateTypes requiredStates = 1; 可选GraphicsStateDef Graphics = 2; 可选AudioStateDef Audio = 3; (等等) } 消息GraphicsStateDef { 扩展100到最大; } 消息AudioStateDef { 扩展100到最大; } (等等) 我的目标是允许稍后使用所需的字段扩展那些_StateDef消息。 但是,此扩展将独立于我正在编写的库。 Kagents.dll […]