问题标签 [ixmlserializable]

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 回答
42 浏览

c# - 使用 XmlSerializer 序列化一个类型,当它有一个空字段时省略它

这是一个独立的示例程序,演示了我的问题:https ://gist.github.com/jennings/46c20733df559d02b9ad

我正在写一个Maybe<T>看起来像这样的类型:

我可以完成序列化的这两个目标之一吗?

  1. 如果一个类型的属性Maybe<T>正在被序列化,如果它为空,则根本不发出该属性_value(字符串属性似乎有这种行为)。

  2. 序列化_value 代替.Maybe<T>

因此,如果使用我的类型的类看起来像这样:

然后如果MaybeaString._value为空,我想要在序列化时这样做:

想要这些:

我不想配置序列化,AnyRandomObjectUsingMyType因为会有很多很多。我宁愿Maybe<T>控制它,这样到处都有相同的行为。


一些上下文

该类型Maybe<T>旨在作为T. 但是我们在几个地方使用了 XML 序列化。如果有这样的对象:

当 SomeValue 为 null 时,此类序列化为:

我希望能够将课程更改为:

我希望序列化的表示是相同的。如果 V1 应用程序反序列化,它会得到一个空字符串。如果 V2 应用程序反序列化,它会得到一个Maybe<string>表示无的。

我已经尝试在我的IXmlSerializable.WriteXml方法中这样做,但是当它被调用时,XmlWriter 似乎已经向它的底层流写入了这么多内容:

因此,当我的WriteXml方法被调用时,似乎为时已晚。也许还有另一种方法来控制它?

如果我可以向序列化程序指定:“一旦遇到 type 的对象Maybe<T>,就序列化它的_value属性来代替Maybe<T>”,它也将实现我的目标。

0 投票
2 回答
257 浏览

c# - 字典序列化:ReadXml() 之后,跳过后续的 XML 元素

在我的一个对象中,我有一个字典,它通过实现进行序列化IXmlSerializable

当我使用普通的 .NET 序列化程序序列化这些对象的列表时,它可以很好地序列化,但是反序列化只执行一个对象——XML 文件中遵循可序列化字典的元素被跳过。

例如,我有一个<MaintenanceIndicators>. 我在下面只显示一个,但这是List<MaintenanceIndicator>代码中的一个。具有多个条目的列表的序列化工作正常,但反序列化多个只给我MaintenanceIndicator列表中的 1。但是,它的参数属性可以反序列化。代码中不会抛出异常。

我使用以下代码进行反序列化:

我在 XML 中的结构如下所示:

0 投票
1 回答
1331 浏览

c# - IXmlSerializable 列表项

为了好玩,我正在尝试开发一个简单的 RPG。我希望我的游戏使用 XML 文件,以便让玩家轻松定制游戏。

我有一个种族类和一个带有所有种族的静态列表的 raceManager 类。我首先使用 XmlAttributs (XmlRoot, XmlElement...) 和默认序列化程序将可播放的比赛写入 Xml。

它可以工作,但在我的比赛课程中,我有技能列表、可用武器列表……默认序列化程序生成包含这些类的所有属性的数组。

因为我只想要每个对象的单个实例,所以我开始实现 IXmlSerializable 接口以仅写入 id 并在读取时检索对象。

现在 Xml 文件几乎就像我想要的那样:

...

但我再也看不懂了:'(

我使用我的经理方法(以前效果很好):

使用了 ReadXml 方法,但返回一个包含 1 个元素(最后一个)的列表。看起来整个文件(包含列表)被发送到我的 ReadXml,它假设只读取该列表的一个元素。

我想我也许应该阻止读者。所以我添加了以下代码,但它没有解决我的问题(只有第一场比赛是用这个检索的)

提前感谢您,并为我糟糕的英语感到抱歉。

编辑:这是一个带有控制台应用程序的最小但完整的示例:

0 投票
1 回答
794 浏览

c# - DataContract + IxmlSerializable

我们在 Java 服务器上创建了一个带有“自定义对象和属性”的项目,并且在 C# 客户端上需要这些数据。

例如,自定义对象“A”具有属性“B”、“C”。“B”和“C”都由客户在运行时描述。服务器以 XML 格式将其发送给我们,例如:

我们创建了一个实现IXmlSerializable的类,它读取/写入 xml 以供服务器将自定义属性填充到字典中

项目很慢,我们想使用更快的 DataContract 序列化。我们通过在我们的属性(如“B”、“C”)上明确指定硬编码 [DataContract] 来对样本进行测试。然而,在我们的用例中,属性在编译时是未知的。我们可以向服务器查询类型“A”的属性列表。

我们如何将 DataContract 用于运行时定义的属性

0 投票
2 回答
4648 浏览

c# - 获取参数的调用变量名

关于从调用方法获取参数名称和查找传递给 C# 中的函数的变量名称的问题,我仍在寻找一种方法来定义WhatDoesTheAnimalSay_WANTED方法:我想知道用作的变量的名称一个参数:

在现实生活中,我在使用自定义和方法IXmlSerializable在我的类中实现接口时需要这个。reader.Read...writer.Write....

因此,不幸的是,我无法引入新的包装类、接口或更改动物名称或它所说的内容的保存位置。这意味着它必须与类以及纯字符串、int、decimal、...变量、字段或属性一起使用。换句话说(不是粗鲁的方式):不要改变动物的定义方式,只需改变WhatDoesTheAnimalSay_WANTED方法......

编辑:

因为你们中的一些人想知道这个例子的真实用例,我在这里给你们一个想法,我如何在 xml 文件中存储和读取数据。真正的 Database 对象当然要大得多,并且所有子类(如FitterIXmlSerializable也使用相同的扩展方法实现接口。

0 投票
1 回答
3528 浏览

c# - C# XML 序列化覆盖 IXmlSerializable 类的类型

最初的问题

我想动态更改类的serializeXmlType 所以我不能使用属性标签来做到这一点)List<IXmlSerializable>IXmlSerializable

我尝试使用XmlAttributeOverrides来做到这一点,但到目前为止没有成功。

这是说明问题的示例代码:
IXmlSerializable 类(来自MSDN):

测试类(使用控制台输出):

这是我想要得到的:

但我在运行时收到此错误:

System.InvalidOperationException:只能为 Person 类型指定 XmlRoot 属性。请使用 XmlSchemaProviderAttribute 指定架构类型。

注意 当我的Person 类没有实现IXmlSerializable时,一切正常......

有人可以帮我吗?


选择的解决方案(基于@dbc answer

正如@dbc 指出的那样,使用“代理”类是做我想做的最简单的方法。但正如我所说,我需要动态更改 Person 类型,这意味着我不能使用属性标签。
所以我仍然XmlAttributeOverrides在我的最终设计中使用,这里是:

代理List<Person>(与没有属性标签的@dbc 相同):

使用 surrogate 测试类:

最后,我非常感谢@dbc,您的回答非常有帮助且内容丰富,我学到了很多东西。我不能投票给你,但我希望社区会这样做!

0 投票
1 回答
215 浏览

c# - 尝试写入内部标记时,IXmlSerializable.WriteXml 期间出现异常

这是一个测试类:

当我调用 WriteXml 时,会引发异常:

在互联网上的示例中,此代码不会导致任何问题(例如http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly),但对我来说它不起作用。可能是什么原因?

更新: 最终,我希望类像这样被序列化:

0 投票
1 回答
973 浏览

c# - XmlSerializer 抛出 System.InvalidOperationException

所以基本上我有2门课:

此代码运行良好:

序列化结果:

但是此代码引发异常:System.Xml.dll 中发生类型为“System.InvalidOperationException”的未处理异常附加信息:XML 文档中存在错误 (4、6)。

所以对于部分的序列化我不能使用基于属性的序列化,但它工作得很好:

UPD1:Section 作为 root 的序列化/反序列化效果很好

0 投票
1 回答
332 浏览

c# - IXmlSerializable 实现后的 WCF 服务 xsd 不正确

我有一个 wcf 服务(使用 xmlserialization)。SoapUI 中有一些类看起来像这样:

我必须在上面实现 IXmlSerializable 接口。完成后,类在 SoapUI 中有奇怪的结构:

可能是 GetSchema 方法的以下实现的结果吗?

以下是来自服务 wsdl 的关于 MyClass 的部分:

0 投票
2 回答
51 浏览

c# - 如何使用对象属性序列化 CustomClass 列表

我想序列化 CMainClass:

属性值的类型可以多种多样,这就是使用对象类型的原因。

这是测试代码

我想要的只是得到以下形式的输出

代替

可能吗?将 Value 的属性从 [XmlElement] 更改为 [XmlAttribute] 会导致错误。