Tag: protobuf net

Protobuf-net:嵌套的IEnumerable对象

我使用Protobuf-net来序列化自定义嵌套列表。 我知道原生列表不能直接嵌套,这就是我为内部列表使用容器对象的原因。 但是,我还想使我的容器对象IEnumerable,但这意味着Protobuf-net将它抛出错误: 不支持嵌套或锯齿状列表和数组 以下是导致错误的列表结构示例: [ProtoContract] public class MyOuterList { [ProtoMember(1)] readonly List<MyInnerList> nestedData = new List<ObjectList>(); } [ProtoContract] public class MyInnerList : IEnumerable { [ProtoMember(1)] private readonly List data = new List(); } 修复是从MyInnerList删除IEnumerable,但显然会阻止它直接迭代。 是否有可以使用的[ProtobufCustomObjectSoPleaseIgnoreIEnumerable]这样的偷偷摸摸的属性? 到目前为止我提出的最好的替代方法是使用如下所示的Enumerable属性,但我担心该属性仍然可以再次转换回列表。 我更喜欢以某种方式使用GetEnumerator/yield但我看不出如何。 [ProtoContract] public class MyInnerList { [ProtoMember(1)] private readonly List data = new List(); public IEnumerable Data { […]

BinaryFormatter中的引用完整性

Protobuf-net中AsReference选项的存在以及BinaryFormatter是一个“图形序列化器”这个词让我认为BinaryFormatter不维护引用并且它会复制每个对象。 但我做了一些测试,发现即使对于递归引用,单个BinaryFormatter Serialize()或Deserialize()调用中的所有引用都会被维护。 我可以确认BinaryFormatter确实维护了引用吗? 这与Protobuf-net有何不同? 好像我理解“图形序列化”不正确? 我还应该注意什么? 提前致谢。

protobuf-net如何序列化DateTime?

我正在开发一个包含Client / Server的项目。 客户端是用Python编写的(将在linux上运行)和C#中的服务器。 我正在通过标准套接字进行通信,我正在使用protobuf-net进行协议定义。 但是,我想知道protobuf-net如何处理DateTime序列化。 Unix日期时间与.net标准日期时间不同,那么我该如何处理这种情况呢? 谢谢

Protobuf-net:无法创建抽象类的实例

基于此处找到的代码: protobuf和List – 如何序列化/反序列化? 我创建了一个通用的“ProtoDictionary”,其值类型为ProtoObject。 这是我的ProtoDictionary代码: public class ProtoDictionary : Dictionary { public void Add(TKey key, string value) { base.Add(key, new ProtoObject<(value)); } public void Add(TKey key, List value) { base.Add(key, new ProtoObject<List>(value)); } public void Add(TKey key, List value) { base.Add(key, new ProtoObject<List>(value)); } public void Add(TKey key, Dictionary value) { base.Add(key, new ProtoObject<Dictionary>(value)); […]

如何使用protobuf-net或其他序列化程序序列化第三方类型?

我有List但是protobuf-net给了我错误,它没有合同。 当我没有源时,如何为它指定合约? 它实际上说它无法推断出类型,但我认为这是因为我没有使用它的属性,对吗? 默认的二进制序列化程序也会抱怨,因为类型未标记为可序列化。 编辑:错误消息是: Type is not expected, and no contract can be inferred: HtmlAgilityPack.HtmlNode

Protobuf.net WCF反序列化列表

我尝试使用带有protobuf-net r.282的WCF 好。 我用ProtoBehavior属性标记我的合同 [OperationContract,ProtoBehavior] [FaultContract(typeof(ServiceFaultException))] Dictionary GetSalesTemplates(); [OperationContract, ProtoBehavior] [FaultContract(typeof(ServiceFaultException))] List GetActivities(); 接下来, – DTO: [DataContract] [Serializable] [ProtoContract] public class ActivityCategoryDTO { [DataMember] [ProtoMember(1)] public int Id { get; set; } [DataMember] [ProtoMember(2)] public string Guid { get; set; } [DataMember] [ProtoMember(3)] public string Name { get; set; } } 我尝试从客户端使用此服务。 当我调用GetSalesTemplates时 – 一切正常。 […]

使用protobuf-net进行惰性,流驱动的对象序列化

我们正在开发用于流式传输大量数据的WCF服务,因此我们选择使用WCF流function与protobuf-net序列化相结合。 语境: 通常,一个想法是序列化服务中的对象,将它们写入流并发送。 在另一端,调用者将接收Stream对象,它可以读取所有数据。 所以目前服务方法代码看起来有点像这样: public Result TestMethod(Parameter parameter) { // Create response var responseObject = new BusinessResponse { Value = “some very large data”}; // The resposne have to be serialized in advance to intermediate MemoryStream var stream = new MemoryStream(); serializer.Serialize(stream, responseObject); stream.Position = 0; // ResultBody is a stream, Result is a […]

强制protobuf-net忽略IEnumerable / ICollection接口

我怎么能得到protobuf-net的v2来忽略我的类实现ICollection,IEnumerable等的事实? 对于这种特殊情况,我只希望标记为[ProtoMember]的字段被序列化。 我目前正在使用protobuf-net v1转换为使用v2。 我有一个特殊的结构,由于更改,现在正在序列化错误。 它看起来像下面这样: [ProtoContract] public class FileTree : ICollection, IEnumerable, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged { private FileTreeNode _Root; [ProtoMember (1)] public FileTreeNode Root { get { return _Root; } set { _Root = value; } } } 编写FileTree类是为了将像“C:\ happy.txt”“C:\ history.txt”这样的文件路径折叠成更像 “C:\h” └─── “appy.txt” └─── “istory.txt” 该结构消除了路径串中的冗余。 所以,我真的不希望通过IEnumerable函数序列化FileTree类,因为它只是存储为“C:\ happy.txt”,“C:\ history.txt”等。现在,在序列化中对于FileTree对象,每个路径都将完全打印出来。 编辑:我要提到的最后一件事 – 我在FileTree中有一个On_Deserialization函数,它用[ProtoAfterDeserialization]标记。 我在函数中放了一个断点,但它没有被击中。 […]

如何使用具有不可变值类型的protobuf-net?

假设我有一个像这样的不可变值类型: [Serializable] [DataContract] public struct MyValueType : ISerializable { private readonly int _x; private readonly int _z; public MyValueType(int x, int z) : this() { _x = x; _z = z; } // this constructor is used for deserialization public MyValueType(SerializationInfo info, StreamingContext text) : this() { _x = info.GetInt32(“X”); _z = info.GetInt32(“Z”); } [DataMember(Order […]

Protobuf.NET使用

需要在托管c#和非托管c ++之间发送一些数据。 经过一番研究后,我尝试使用Protobuf.NET。 我不确定我是否理解ProtoBuf的function…… 在Proto中构建一个类型定义。 我在c ++和c#项目中都需要这种类型定义 使用命令行工具“protogen.exe”从类型定义中获取.cs文件和.cpp,.h 将.cs文件复制到我的c#项目和我的c ++解决方案中的.cpp,.h。 似乎我愚蠢地解决这个问题。 这是我的问题和疑问。 是否可以在c#中定义类型以生成c ++中的文件? 试图使用命令行工具protogen.exe与以下文件 test1.proto using ProtoBuf; namespace ProtocolBuffers { [ProtoContract] class Person { [ProtoMember(1)] public int Id {get;set;} [ProtoMember(2)] public string Name { get; set; } } } test2.proto message Person { required int32 id = 1; required string name = 2; optional […]