Tag: protobuf net

ProtoInclude属性意味着什么(在protobuf-net中)

在ProtoBuf-Net实现中, ProtoInclude属性意味着什么,它有什么作用? 一个例子将不胜感激。 我在这篇文章中看到了它,我不确定它是做什么的。 这个例子是: [Serializable, ProtoContract, ProtoInclude(50, typeof(BeginRequest))] abstract internal class BaseMessage { [ProtoMember(1)] abstract public UInt16 messageType { get; } } [Serializable, ProtoContract] internal class BeginRequest : BaseMessage { [ProtoMember(1)] public override UInt16 messageType { get { return 1; } } } 另外,有没有办法使用protogen工具生成这种inheritance?

protobuf-netinheritance

Marc在stackoverflow上提到,在protobuf-net的v2中可以使用ProtoInclude属性(或类似方法)来序列化/反序列化类层次结构,而无需在基类中指定每个子类型。 这实现了吗? 我们有一个可以在外部库中派生的插件接口,因此无法知道派生类型是什么。 我们可以在类型之间保持唯一的编号,但我在网上找不到任何示例,缺少使用ProtoInclude属性,需要指定子类型。 如果我不知道子类是什么,我将如何使用protobuf-net实现inheritance?

没有注释的Protobuf-net序列化

我查看了这个答案,我处于这样一种情况:我不需要保持向后兼容性,我必须有一个解决方案,无需用protobuf-net所需的属性装饰数十个类。 所以我尝试使用RuntimeTypeModel.Default.InferTagFromNameDefault = true; 但我可能没有正确使用它,因为Serializer.Serialize调用仍然会引发exception,要求签订合同。 这是我的快速测试,我做错了什么? public enum CompanyTypes { None, Small, Big, Enterprise, Startup } public class BaseUser { public string SSN { get; set; } } public class User : BaseUser { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } […]

动态对象序列化

我尝试使用BinaryFormatter序列化DynamicObject类,但是: 输出文件太大,不完全是导线友好的 未处理循环引用(序列化时卡住) 由于序列化DynamicObject本身意味着很少,这里是我尝试序列化的类: [Serializable()] class Entity : DynamicObject, ISerializable { IDictionary values = new Dictionary(); public Entity() { } protected Entity(SerializationInfo info, StreamingContext ctx) { string fieldName = string.Empty; object fieldValue = null; foreach (var field in info) { fieldName = field.Name; fieldValue = field.Value; if (string.IsNullOrWhiteSpace(fieldName)) continue; if (fieldValue == null) continue; this.values.Add(fieldName, […]

如何使用ProtoBuf-Net序列化inheritance的类

如果这是重复,我很抱歉。 我搜索了几个地方寻找我可能理解的答案,包括: ProtoBuf.net序列化派生类时不包括基类属性 使用protobuf-net序列化inheritance的类 我很抱歉,但我并不理解答案。 我正在寻找一个更快,更紧凑的二进制序列化器,ProtoBuf看起来可能是答案。 我需要序列化一组所有派生自一个基类的类。 它们有很多,所以在提交编辑类代码之前,我运行了一个简单的测试。 此外,我不想以任何可能影响反序列化使用NET二进制序列化程序生成的旧持久文件的方式修改类。 这是基类: [ProtoContract] public class BaseClass { [ProtoMember(1)] public string Name { get; set; } [ProtoMember(2)] public int Age { get; set; } } 这是派生类: [ProtoContract] public class SubClass1 : BaseClass { [ProtoMember(3)] public string Town { get; set; } [ProtoMember(4)] public Sex Sex { get; set; […]

XML与序列化/反序列化的二进制性能

我正在开发一个紧凑的框架应用程序,需要提高性能。 该应用程序当前通过将对象序列化为XML并将其存储在数据库中而脱机工作。 使用分析工具,我可以看到这是一个相当大的开销,减慢了应用程序。 我想如果我切换到二进制序列化,性能会增加,但因为在紧凑框架中不支持,我看了protobuf-net。 序列化似乎更快,但反序列化要慢得多,并且应用程序比串行化更多地反序列化。 二进制序列化应该更快,如果是这样,我可以做些什么来加快性能? 这是我如何同时使用XML和二进制文件的片段: XML序列化: public string Serialize(T obj) { UTF8Encoding encoding = new UTF8Encoding(); XmlSerializer serializer = new XmlSerializer(typeof(T)); MemoryStream stream = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8); serializer.Serialize(stream, obj); stream = (MemoryStream)writer.BaseStream; return encoding.GetString(stream.ToArray(), 0, Convert.ToInt32(stream.Length)); } public T Deserialize(string xml) { UTF8Encoding encoding = new UTF8Encoding(); XmlSerializer […]

protobuf和List – 如何序列化/反序列化?

我有一个List其中包含不同类型的对象,如整数,字符串和自定义类型。 所有自定义类型都是protobuf调整。 我现在要做的是使用protobuf.net序列化/反序列化此列表。 到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的。 因为二元形成器没有问题做这些事情我希望我错过了什么,你可以帮助我。 所以我的问题是如何处理protobuf.net中的对象。

在Protobuf-net中,如何在内部传递具有不同类型对象的类型对象数组,事先知道潜在类型的集合

我正在尝试将使用XmlSerializer的现有代码迁移到protobuf-net,因为它提供了更高的性能,但是我遇到了这个特定情况的问题。 我有一个对象[],其中包含将要发送到远程主机的参数(一种自定义的迷你rpc工具)。 我知道这些参数的类型集合,但我无法预先知道它们将以何种顺序发送。 我有三个限制。 首先是我在Compact Framework中运行,所以我需要在那里工作的东西。 其次,正如我所提到的,性能是一个很大的问题(在序列化方面)所以我宁愿避免在可能的情况下使用大量的reflection。 最重要的是我关心这些参数的发送顺序。 使用XmlSerializer很容易只添加XmlInclude,但对于字段,就我所知,在Protobuf-net中没有任何等价物。 那么,有没有办法做到这一点? 这是一个简化的例子。 [Serializable] [XmlInclude(typeof(MyType1)), XmlInclude(typeof(MyType2)), XmlInclude(typeof(MyType3)) public class Message() { public object[] parameters; public Message(object[] parms) { parameters = parms; } } Message m = new Message(new object[] {MyType1(), 33, “test”, new MyType3(), new MyType3()}); MemoryStream ms = new MemoryStream(); XmlSerializer xml = new XmlSerializer(typeof(Message)); xml.Serialize(ms,xml); […]

使用protobuf-net反序列化未知类型

我有2个网络应用程序,应该相互发送序列化的protobuf-net消息。 我可以序列化对象并发送它们,但是, 我无法弄清楚如何反序列化接收的字节 。 我尝试使用它反序列化,并且失败并出现NullReferenceException。 // Where “ms” is a memorystream containing the serialized // byte array from the network. Messages.BaseMessage message = ProtoBuf.Serializer.Deserialize(ms); 我在包含消息类型ID的序列化字节之前传递一个标头,我可以在一个巨大的switch语句中使用它来返回预期的sublcass Type。 使用下面的块,我收到错误:System.Reflection.TargetInvocationException —> System.NullReferenceException。 //Where “ms” is a memorystream and “messageType” is a //Uint16. Type t = Messages.Helper.GetMessageType(messageType); System.Reflection.MethodInfo method = typeof(ProtoBuf.Serializer).GetMethod(“Deserialize”).MakeGenericMethod(t); message = method.Invoke(null, new object[] { ms }) […]