问题标签 [netdatacontractserializer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
382 浏览

protobuf-net - 继承类的 Protobuf .NET 序列化

我正在尝试将我的代码序列化程序从 NetDataContract 迁移到 Protobuf.Net。

让我们考虑以下类示例来帮助理解:

为了能够通过 DataContract 使用 Protobuf .NET,我使用了以下选项:

使用这些选项,上面显示的示例的序列化可以工作,但是当添加它的继承时,复杂性会增加。让我们用这个类改进我们的例子:

现在,为了能够序列化从“Test”继承的类“InheritanceTest”,我必须添加 ProtoInclude 参数(已经尝试仅使用 KnownType 但它不起作用)。类“测试”属性应该是这样的:

恕我直言,复杂性在于您必须使用成员(DataMembers)自动分配的订单中未自动使用的数字填充“标签”。在此示例中,如果我使用 TAG=1 则会出错,因为属性 Id 已经使用它。与 TAG=2 和属性名称相同。所以我至少需要放3个。

没关系,因为这个类太简单了,但是当这个类有几个属性时我该怎么办?每当我向其添加属性时,我是否应该更改 TAG?维护起来似乎很糟糕。

我怎样才能以更简单的方式做到这一点?我错过了什么吗?

考虑到它是自动分配的,它应该只执行一次并缓存。更好的是,它应该在编译时完成。

另外...为什么我不能使用 [KnownType] 属性,并且序列化程序会根据定义的类类型的 DataContract 的名称自动分配 TAG?请注意,使用 Name 自动分配 Order 的 DataMember 也会发生类似的情况。

0 投票
0 回答
63 浏览

c# - DataContractSerializer 不序列化自定义集合的属性

我从人们那里发现了关于集合中对象属性的类似问题,但我的问题是关于集合本身的属性。在下面的示例中, 的Something属性Collection不会从序列化返回。

如何DataContractSerializer序列化Something集合的属性?我知道在集合对象之外创建属性的解决方法,但这否定了甚至使用自定义集合的原因(将来可以向它添加属性的能力)。

这也会NetDataContractSerializer发生XmlSerializer

对象

序列化助手

示例程序

输出

0 投票
0 回答
19 浏览

c# - 使用 NetDataContractSerializer 从 DataContract 集成到 IXmlSerializable

我有一些数据保存在数据库中。序列化的内容最初是使用NetDataContractSerializer带有DataContract类属性的默认值编写的。现在我想转向使用实现的类IXmlSerializable来更好地控制序列化内容并使其更精简和更快。
我将如何能够以新的方式阅读当前内容以及存储未来的内容。我已经研究过了ISurrogateSelector,但它似乎并没有起到作用,因为ISerializationSurrogate接口只支持获取和设置对象数据作为ISerializable接口,但无法指定ReadXmlWriteXmlIXmlSerializable接口中。当我在流中阅读时,除了流本身之外,我没有任何关于格式的信息。
无论原始序列化方法如何,反序列化都必须产生相同的类实例。
我需要制作一个使用 .NET Framework 4.6 的解决方案

0 投票
1 回答
312 浏览

c# - 从 WCF 迁移到 gRPC,替换 NetDataContractSerializer

作为从 WCF 迁移到 gRPC 的一部分,我正在处理NetDataContractSerializer,它用于在客户端序列化对象并在服务器端反序列化。客户端和服务器都与通信中使用的类型共享相同的 DLL。

作为客户端应用程序更新过程的一部分,从服务器下载具有新/更改/删除通信对象定义的共享 DLL 的实际版本。用于更新过程的基本通信对象永远不会改变。所以更新期间的序列化/反序列化工作。

我想尽可能少地重写现有代码。我发现我可以用NetDataContractSerializerNewtonsoft 的 Json.NET 序列化替换,如下所述: 如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?在这里https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

但我想知道是否:

  1. 一般有更好的解决方案吗?
  2. 是否有一些基于 .NET 框架 4.8 的一部分的解决方案,并且也可以在 .NET 5.0 中工作而无需参考第三方 DLL?
  3. 是否有一些二进制序列化替代方案对消息大小更友好/更快?我不必以可读的形式发送消息。