Tag: protocol buffers

套接字上的Protobuf-net序列化。 没有无参数构造函数发现ProtoException

我创建了一个使用套接字完成进程间通信的应用程序。 当客户端与我创建的服务器连接并发送序列化消息时,该过程开始。 这条消息,我使用Protobuf-net进行序列化,使用SerializeWithLengthPrefix并使用DeserializeWithLengthPrefix对其进行反序列化。 客户端将消息发送到完全反序列化的服务器,但在服务器到客户端的情况下却不是这样。 主类是BaseMessage,它是抽象的。 [Serializable, ProtoContract, ProtoInclude(5001, typeof(LogonMessage))] abstract public class BaseMessage { public BaseMessage() { } abstract public int MessageType { get; } } LogonMessage实现了BaseMessage类。 [Serializable, ProtoContract] public class LogonMessage : BaseMessage { public LogonMessage() { } [ProtoMember(1)] public string Broker { get; set; } [ProtoMember(2)] public int ClientType { get; set; } […]

C#Google.ProtocolBuffers反序列化方法(proto3)

我最近升级了我的代码库(Java,C ++和C#)以使用proto3。 在C#的情况下,这涉及对代码的2000多次更改。 这主要是语义的,都很好,但有一个问题我似乎无法理解; 序列化/反序列化。 我有以下修改的方法去解除我的IMessage类型(在proto2中执行此操作的代码被注释),这是在GitHub存储库中的示例中显示的代码… public static T ToObject(this byte[] buf) where T : IMessage { if (buf == null) return default(T); using (MemoryStream ms = new MemoryStream()) { ms.Write(buf, 0, buf.Length); ms.Seek(0, SeekOrigin.Begin); MessageParser parser = new MessageParser(); return (T)parser.ParseFrom(ms); //ProtoBuf.Serializer.Deserialize(ms); } } 但是MessageParser parser = new MessageParser();行MessageParser parser = new MessageParser(); 给我一个设计/编译时错误 […]

protobuf.net意外的子类型

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

使用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-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 […]

在C#中解析原始协议缓冲区字节流

给定协议缓冲区编码的Stream或byte[]但不知道对象类型本身,我们如何打印消息的骨架? 该用例用于调试基于protobuf的IO,用于根本原因分析。 如果现有工具可以解析二进制文件中的原始协议缓冲区字节流 – 这将是很棒的! 另一种方法是使用ProtoBuf.NET类ProtoReader()来保持一致,直到我们遇到错误但ProtoReader()的使用不清楚。 我从下面开始,但找不到关于如何使用ProtoReader类实际执行它的好文档。 该项目的源代码也不是很容易遵循……所以会很感激一些提示/帮助 using (var fs = File.OpenRead(filePath)) { using (var pr = new ProtoReader(fs, TypeModel.Create(), null)) { // Use ProtoReader to march through the bytes // Printing field number, type, size and payload values/bytes } }

.NET / C#与Python互操作

我的后端是用.NET / C#编写的,我要求我需要执行python脚本从房子的.net端传递上下文。 这些在作为Windows服务运行的名为hangfire的后台任务引擎中排队。 我做了一点挖掘并找到了IronPython ,然而,在实现之后它无法支持我需要在我的脚本中执行的许多pypi python包。 其次,我查看了Python.Net ,它是一个嵌入式解释器,嵌入或扩展了CPython。 CPython可以运行我需要的所有脚本/等等,但是,我发现一直打开/关闭python解释器会产生很多内存泄漏,并且总是存在线程约束。 有关详细信息,请参阅文档 。 我想知道.net中的这个interopt和嵌入python是否是一个好主意。 我想知道是否使用像celery之类的东西使python成为自己的执行引擎,并使用protobufs之类的东西编组数据将是一个更好的解决方案? 这给我的堆栈增加了更多的复杂性和额外的任务引擎。 我想知道是否有其他人有任何想法/反馈/经验试图完成类似的事情? 谢谢!