问题标签 [datacontractserializer]

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 投票
2 回答
2014 浏览

.net - XML 和 DataContractSerializer

我有这样的课

我希望它像这样生成 XML

但我得到的东西更像:

有可能解决这个问题吗?这篇文章说 DataContractSerializer 的缺点之一是:

  1. 除了设置名称和顺序之外,无法控制对象的序列化方式

让我想知道这不是一个可以解决的问题。


我知道这可以用IXmlSerializableand ReadXml/来完成,WriteXml因为我应该删除这样做的代码。

0 投票
1 回答
357 浏览

datacontractserializer - 在反序列化期间使用 DataContractSerializer 获取父对象

或多或少与此问题相同,但针对 DataContractSerializer 而不是 Serializable。

我明确不想序列化父引用。

另外,我真的希望在构造子对象之前绑定对象的父对象。

顺便说一句:如果这有什么不同,我正在使用 XML

0 投票
1 回答
1765 浏览

.net - 如何为 DataContractSerializer 设置 StreamingContext?

我有一些类似这样的代码:

我需要提供StreamingContext结构。我发现了几个可以这样做的参考资料,NetDataContractSerializer但没有DataContractSerializer

  • 有没有办法使这项工作?
  • 我只是做错了吗?
0 投票
2 回答
8683 浏览

c# - 我可以将 DataContractSerializer 配置为不在输出 XML 中创建可选(即 Nullable<> 和 List<>)元素吗?

我正在使用新的 .NET 3.0 DataContractSerializer。我有我要序列化的 Nullable< > 和 List< > 对象。例子:

当 .NET 序列化 null 或空列表时,它会将 nil(对于 Nullable)和空(对于列表)元素放入 XML。上面的示例生成:

由于我没有时间描述的原因,我想消除多余的 NullableNumber 和 Numbers 元素,如下所示:

事实上,上面的文件用序列化器反序列化就好了。

谢谢你的帮助!

0 投票
3 回答
3802 浏览

c# - 将 ISerializable 与 DataContractSerializer 一起使用时,如何阻止序列化程序输出类型信息?

为了更好地控制序列化,我将一个类从 转换[DataContract][Serializable],同时实现GetObjectData了特殊的反序列化构造函数。当我这样做时,发出的 XML 现在具有应用于所有元素的类型信息。我不想要这些多余的信息,我想知道如何通知序列化程序不要输出它。

这是使用的示例代码[DataContract]

这将输出以下 XML(注意 Nullable Number 和 Number 上没有类型信息——这是所需的输出):

如果我将上面的代码修改如下(添加[Serializable],:ISerializable,以及两个序列化方法):

它现在发出以下 XML。注意添加到每个元素的类型信息 (i:type="x:int")。

为什么要这样做?我该如何阻止它这样做?

谢谢!

0 投票
1 回答
1747 浏览

wcf - WebInvoke/DataContractJsonSerializer,“1,6276”不能解析为“双”

我将 WCFWebInvokeAttribute用于声明性 JSON 请求 ( DataContractJsonSerializer),并带有DataContractAttribute/DataMemberAttribute基于的序列化。

我使用的服务支持返回包含基于不同文化的数据的 JSON。默认情况下,此服务使用 en-US 文化设置,这意味着小数分隔符将为“.”。

我有一个有System.Double属性的类。如果我使用使用“,”作为小数分隔符的区域性请求数据SerializationException,则在解析以下内容时,我会尝试反序列化此属性的值System.Double

“反序列化 XXX 类型的对象时出错。值 '1,6276' 无法解析为类型 'double'。”

这当然是因为在解析 Double 时使用了不变的文化。我希望在当前线程上设置正确的文化可以解决这个问题,但它没有。

因此,对于任何不使用“.”的文化,服务都会中断。作为小数分隔符。

将感谢帮助。

谢谢!

0 投票
2 回答
862 浏览

.net - 您可以使用 DataContractSerializer 对序列化进行条件控制吗?

我正在将我的一些类转换为使用 DataContractSerialization,以便可以在输出中包含 Linq 实体。在这个过程中,一个理论问题突然出现在我的脑海中,当我打赌答案是“不”时,我想我还是会提出这个问题。

有没有办法有条件地序列化一个对象?例如,如果我为了向客户发送信息而序列化一个 Employee 对象,我可能不想包含地址。另一方面,如果我将其序列化以在管理该员工的网站的 Web 服务中使用,我可能需要该信息。

另一种可能性是根据它们是否是被序列化的基础对象来序列化某些成员。因此,如果我有一个包含 Location 的 Ticket 类,并且 Location 包含一个联系人列表,如果我正在序列化 Ticket,我可能不想要那个联系人列表。但是,如果我尝试使用 Location 本身,那么拥有它可能会很好。

那么对此有什么想法吗?

0 投票
3 回答
1163 浏览

.net - XSL 样式表不会解析由 DataContractSerializer 生成的 XML

我使用 XMLSerializer 序列化了一些类,然后使用 XSLT 将其转换为各种格式的电子邮件或 Web 服务调用。一切都好。

我们开始在数据层的某些部分使用 Linq,我需要序列化一些 Linq 对象以供 XSL 样式表使用。我认为最好转向使用 DataContractSerializer 而不是 XMLSerializer。

我得到了 DataContracts 并设置了所有内容,并且通过对实体名称进行了一些小的更改来很好地序列化......但是现在样式表根本不会处理 XML。我真的不知道为什么我至少没有得到一些东西......基本上所有出来的都是从 xsl 标签中剥离的数据。

有什么想法会导致这种情况吗?

编辑:

这是在我修改 DataContract 声明之前从 DataContractSerializer 生成的 XML:

0 投票
2 回答
1821 浏览

.net - 公开 WCF 服务可能不直接使用的对象 (DataContracts)?

我有一些使用继承的对象类。似乎我只能访问服务直接使用的对象。让我向您展示我要完成的工作:

服务:

现在因为我在服务中使用 object2,所以 object1 也被序列化了。但是,出于某种原因,我可能希望公开 object3。它可能是我必须传递的派生类,以便稍后可以为另一个进程确定其类型。我没有看到这个对象被序列化。我假设每当您设置 DataContract / DataMember 时,这些对象都会被序列化。不暴露未开始使用的东西确实有意义,因为我可以看到暴露您可能不需要的项目的问题。公开服务不直接使用的对象的最佳方法是什么?谢谢

丹尼尔

0 投票
1 回答
5203 浏览

c# - 树结构的序列化/反序列化

我试图找出保存(序列化)然后打开(反序列化)树结构的最佳方法。我的结构由具有不同属性的各种对象类型组成,但每个对象类型都继承自一个基本的抽象“节点”类。

每个节点都有唯一的 ID (GUID),并有一个 AddSuperNode(Node nd) 方法来设置节点的父节点。这反过来又调用了其他方法,允许父节点知道它有哪些子节点。但是,一些节点也使用AddAuxSuperNode()方法将次父节点添加到节点。

我使用的是二进制序列化,但现在我想我想使用一些我有更多控制权的东西,并且序列化的数据更容易访问。我还想在反序列化时保留类型信息,并能够序列化私有值。所以DataContractSerializer似乎是最好的方法。

我不能直接序列化根节点,因为节点有多个父节点。我不想创建重复的对象。所以看起来我需要将树解构为一个平面列表,然后将其序列化。然后在序列化该列表之后重建树。这听起来对吗?

就像我之前所说的,每个节点都有一个唯一的 GUID 标识符,但是现在节点直接引用它们的父/子,并且不存储它们的 id。除了直接引用之外,我还可以更新AddSuperNode()AddAuxSuperNode()方法来更新要序列化的父 ID 列表。但我宁愿只在对象被序列化时更新/创建这个列表。所以我正在考虑在节点中创建一个UpdateSuperNodeIDRefs()方法,该方法将在序列化之前被调用。

以下是我打算为这个结构的序列化和反序列化做的事情。谁能建议一种更好/更清洁/更有效的方法来做到这一点?

序列化

1)提供树结构的根节点

2) 将树结构分解为一个平面Dictionary(Guid id,Node nd),其中idndguid

3) 调用UpdateSuperNodeIDRefs();为每个节点更新它为其父节点保存的 ID。

4)使用DataContractSerializer序列化节点字典

反序列化

1)反序列化节点字典

2)遍历Dictionary中的每个节点,将每个节点重新连接到它们的父节点。对于存储的任何父 ID ,在字典中找到具有匹配 ID的相应节点,调用AddSuperNode()AddAuxSuperNode()以将节点重新连接到其父节点

3)从字典中的任何节点找到结构的根

4)返回根节点