Tag: protobuf net

什么是protobuf-net SerializeWithLengthPrefix标签参数?

这个方法接受一个整数作为最后一个参数,但我不确定我是否理解我将完全使用它。 Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 对于相应的Deserialize方法也是如此。 它只是一种标记消息的方法,可以在反序列化时添加某种“查询”function来过滤掉不需要的消息,还是有任何其他用法?

Protobuf-Net错误消息:没有为类型定义Serializer:System.Type

尝试序列化List<Tuple>时收到以下错误消息:没有为类型定义Serializer:System.Type 我尝试了两种方法,只是序列化上面的集合或序列化一个具有定义为protoMember的相同集合的类。 两者都会导致相同的错误消息。 这是不受支持的类型吗? 我认为它是受支持的,我忽略了别的东西,但也许我不正确? 感谢任何可能有助于解决此问题的指针……

protobuf-net,版本控制和代理类型的最佳实践

我正在尝试使用protobuf-net(Marc Gravell的实现)来确定如何解决这个用例。 我们有A类,它被认为是版本1 A类的实例已序列化为磁盘 我们现在有了B类,它被认为是A类的第2版(A类有很多错误,我们必须为下一个版本创建B类)。 A类仍然存在于代码中,但仅用于传统目的。 我想将版本:1数据(存储到磁盘)反序列化为B类实例,并使用逻辑例程将数据从先前的A类实例转换为B类的新实例。 B类实例将在操作期间序列化为磁盘。 应用程序应该期望反序列化A类和B类的实例。 我想到了数据契约代理和DataContractSerializer的概念。 目标是将版本:1数据转换为新的B类结构。 一个例子: [DataContract] public class A { public A(){} [DataMember] public bool IsActive {get;set;] [DataMember] public int VersionNumber { get { return 1; } set { } } [DataMember] public int TimeInSeconds {get;set;} [DataMember] public string Name {get;set;} [DataMember] public CustomObject CustomObj {get;set;} //Also a […]

如何在Protobuf中发送多种类型的对象?

我正在实现客户端 – 服务器应用程序,并正在研究序列化和传输数据的各种方法。 我开始使用Xml Serializers,它运行得相当好,但是生成数据很慢,并且生成大对象,特别是当它们需要通过网络发送时。 所以我开始研究Protobuf和protobuf-net。 我的问题在于protobuf没有发送类型信息。 使用Xml Serializers,我能够构建一个包装器,它将在同一个流上发送和接收任何各种(可序列化)对象,因为序列化为Xml的对象包含对象的类型名称。 ObjectSocket socket = new ObjectSocket(); socket.AddTypeHandler(typeof(string)); // Tells the socket the types socket.AddTypeHandler(typeof(int)); // of objects we will want socket.AddTypeHandler(typeof(bool)); // to send and receive. socket.AddTypeHandler(typeof(Person)); // When it gets data, it looks for socket.AddTypeHandler(typeof(Address)); // these types in the Xml, then uses // the appropriate […]

protobuf-net:序列化一个空列表

我们在序列化一个空列表时遇到了一些问题。 这里有一些使用CF 2.0的.NET代码 //Generating the protobuf-msg ProtoBufMessage msg = new ProtoBufMessage(); msg.list = new List(); // Serializing and sending throw HTTP-POST MemoryStream stream = new MemoryStream(); Serializer.Serialize(stream, msg); byte[] bytes = stream.ToArray(); HttpWebRequest request = createRequest(); request.ContentLength = bytes.Length ; using (Stream httpStream = request.GetRequestStream()) { httpStream.Write(bytes, 0, bytes.Length); } 当我们尝试在流上写入时(bytes.length超出范围),我们得到了一个exception。 但是具有空List的类型不应该是0字节,右(type-in​​formation?)? 我们需要这种类型的发送,因为在响应中是来自服务器的消息给我们的客户端。

protobuf-net序列化为字符串并存储在数据库中然后进行序列化

我想使用字符串序列化/反序列化对象。 需要注意的是,当我序列化/反序列化到文件时,一切正常。 我想要做的是获取一个字符串,以便我可以将它存储在数据库中,然后将其拉出来反序列化。 这是有效的代码: MemoryStream msTest = new MemoryStream(); Serializer.Serialize(msTest, registrationBlocks); msTest.Position = 0; List CopiedBlocks = new List(); CopiedBlocks = Serializer.Deserialize<List>(msTest); “CopiedBlocks”对象与“registrationBlocks”中的列表相同,工作正常,所有序列化/反序列化。 我在这里保留所有内容。 当我尝试获取涉及的字符串时,以下代码不起作用: MemoryStream msTestString = new MemoryStream(); Serializer.Serialize(msTestString, registrationBlocks); msTestString.Position = 0; StreamReader srRegBlock = new StreamReader(msTestString); byte[] bytedata64 = System.Text.Encoding.Default.GetBytes(srRegBlock.ReadToEnd()); string stringBase64 = Convert.ToBase64String(bytedata64); byte[] byteAfter64 = Convert.FromBase64String(stringBase64); MemoryStream afterStream = […]

Protobuf属性具有generics类的层次结构

我有一个类似于此的类层次结构。 这些类包含我已排除的许多其他细节。 这是一个简化,专注于这些类的序列化方面。 [ProtoInclude(1, typeof(Query))] [ProtoInclude(2, typeof(Query))] [ProtoInclude(3, typeof(Query))] [ProtoInclude(4, typeof(Query))] [ProtoInclude(5, typeof(Query))] abstract class Query { public string Result { get; set; } } [ProtoInclude(1, typeof(SpecialQuery)] abstract class Query : Query { public new T Result { get; set; } } abstract class SpecialQuery : Query { public new string Result { get; set; […]

protobuf-net:检测到可能的递归

我尝试序列化对象图(不是很深)时遇到exception。 有意义的部分是这样的: [错误]致命的未处理exception:ProtoBuf.ProtoException:可能的递归检测(偏移量:5级):ProtoBuf.ProtoWriter.CheckRecursionStackAndPush(object)处的ProtoBuf.ProtoWriter.StartSubItem(对象,ProtoBuf.ProtoWriter) ,bool) 该图表示文件/目录结构,我的模型(简化)如下所示: [ProtoContract] [ProtoInclude(100, typeof(PackageDirectory))] [ProtoInclude(200, typeof(PackageFile))] public abstract class PackageMember { [ProtoMember(1)] public virtual string Name { get; protected set; } [ProtoMember(2, AsReference=true)] public PackageDirectory ParentDirectory { get; protected set; } } [ProtoContract] public class PackageDirectory : PackageMember { [ProtoMember(3)] private Dictionary _children; public PackageDirectory() { _children = new Dictionary(); } […]

ProtoBuf-net序列化IEnumerable

我正在尝试在我的项目中使用ProtoBuf-NET(它主要是Silverlight 4项目)。 我在序列化我的模型集合时遇到了困难,它们都是这样定义的: private List _itemsSet; public IEnumerable TSet { get {return _itemsSet;} set {_itemsSet = value == null ? new List() : new List(value);} } public void AddT(T item) { //Do my logic here _itemsSet.Add(item); } 更新:首先我不能序列化它 – No serializer defined for type: System.Collections.Generic.IEnumerable 1 [MyType]`。 其次,我想我将无法根据手动和protobuf-net源代码分析来绝对它。 有没有办法扩展protobuf-net以将代理提供给ProtoMemeber属性中的外部Add方法? 为什么使用ProtoMember(1, OverwriteList=true)不起作用? 它不是要覆盖集合而不应该关心Add()方法吗? 为什么它只是不尝试将此属性设置为T []或List或任何可分配给IEnumerable集合? 有没有办法提供自定义reflection机制来处理Silverlight中的私有字段,如:implementation: […]

在ProtoBuf-net中序列化字典失败

(注意:字典,其中T是一些ProtoContract / ProtoMembered类工作正常。)这个问题只发生在我的类型对象上。 我试图序列化词典工作字典。 typeof(object)不起作用。 应该是? 我应该实现基于字符串的解决方案吗? 在这种情况下,对象将只是一个.net原语。 [Test] public void De_SerializeObjectDictionary2() { var d = new Dictionary(); d.Add(“abc”, 12); var ms = new MemoryStream(); var model = ProtoBuf.Meta.RuntimeTypeModel.Default; //model.AutoAddMissingTypes = true; //model.AutoCompile = true; //model.InferTagFromNameDefault = true; //model.Add(typeof (object), false); //model.Add(typeof(Int32), true); //model[typeof (object)].AddSubType(50, typeof (Int32)); model.Serialize(ms, d); Serializer.Serialize<Dictionary>(ms, d); // <— No serializer […]