问题标签 [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 投票
2 回答
8696 浏览

.net - 使用 IXmlSerializable 导出数据协定类型的 WSDL/XSD 模式

我正在创建一个我想从 Java 应用程序使用的 WCF 服务。但问题不在于 .net-java 互操作。

关键点是与服务操作相关的类型之一是 IXmlSerializable。该类型使用 XmlSchemaProviderAttribute 引用的静态方法返回其 XSD 架构。问题是当我们通过 mex-endpoint ( http://..svc?wsdl ) 获取服务的 wsdl 时,该模式没有返回。

这是详细信息。

一些 wcf 服务合同:

DomainData 类型为:

如您所见, DomainData 包含 AuxDomainData 对象的字典,即:

在这里,我们在 GetXmlSerializationSchema 方法中返回 XSD 架构。Schema 本身很简单,但让我在这里跳过它。

我猜该代码很简单,这是 IXmlSerializable 类型的常见场景。

现在,我们需要 WSDL。我将使用 WSDL 在Metro的帮助下创建 Java 客户端 但实际上 JDK 1.6 就足够了,因为它包含 WS 堆栈(和 wsimport.exe)。所以 java 想要带有 wsdl:service 定义的 wsdl。这就是为什么我不能从 wsdl.exe 给它一个 wsdl(因为 wsdl 生成的 wsdl 不包含 wsdl:service 定义,只有 wsdl:portType)。所以,我调用 wsimport.bat http://localhost/Service1.svc?wsdl

但我得到的是:[ERROR] undefined simple or complex type 'q1:AuxDomainData' line 1 of http://locahost/CustomSerialization/Service1.svc?xsd=xsd3

那是因为组合的 wsdl 实际上不包含 AuxDomainData 之类的类型。这是真的,我们不能责怪 java/metro/任何其他堆栈。如果我们查看由 wcf 生成的 wsdl,它包含 wsdl:types 元素以及所有 xsd 模式的导入:

我不会在这里提供所有 xsd,但关键是它们中没有AuxDomainData 定义。AuxDomainData 类型的 xsd 模式位于http://localhost/CustomSerialization/Service1.svc?xsd=xsd 4 "document" 中。但正如您所见,根 wsdl 不包含对它的引用。那就是问题所在。结果 wsdl/xsd 模式集不完整。

那么,我有哪些选择?

0 投票
3 回答
11709 浏览

c# - 使用 XmlSerializer 自定义序列化

我有一个类,我需要从中执行一些自定义 XML 输出,因此我实现了 IXmlSerializable 接口。但是,除了我想更改 xml 标记名称之外,我想使用默认序列化输出一些字段。当我调用 serializer.Serialize 时,我会在 XML 中获得默认标记名称。我可以以某种方式更改这些吗?

这是我的代码:

这是我的 XML 输出:

我想要结束的是:

0 投票
2 回答
2573 浏览

c# - 在基类中实现 IXmlSerializable 时如何恢复为“默认”XML 序列化?

我正在尝试序列化从实现 IXmlSerializable 的基类继承的类。

名为 PropertyBag 的基类是一个允许动态属性的类(Marc Gravell 的功劳)。

我实现了 IXmlSerializable 以便将动态属性(存储在字典中)写为普通的 xml 元素。

例如,当使用公共属性(非动态)名称和动态属性 Age 序列化 Person 类时,我希望它生成以下 XML:

我可以让部件与基 PropertyBag 类中的以下 WriteXml 实现一起工作:

但是,在序列化 Person 类时,它不再序列化普通(非动态)属性,除非我覆盖 Person 中的 WriteXml 方法(我不想这样做)。有什么方法可以在基类中自动添加静态属性?我知道我可以使用反射手动执行此操作,但我想知道 .Net 框架中是否有一些内置功能?

0 投票
1 回答
142 浏览

c# - 在 IXmlSerializable 中查找引用

我正在使用 IXmlSerializable 将特定类型的元素写入传出 xml。我已经实现了架构,并且正在写出这些项目。下面的代码是一个示例。

我遇到的问题是 MyType 被声明为使用引用

因此,当项目已经写入 xml 时,它需要成为一个引用。

我如何知道是否已将引用写入 xml?我认为我必须忽略我明确无法控制的引用。这样,我将组成自己的参考 ID 并参考我自己的实例。

这显然是一个糟糕的妥协,因为我正在复制不应复制的引用。

有没有办法找出已经写的内容,看看我是否可以找到已经序列化的项目的 id?

问候

克雷格。

0 投票
1 回答
5847 浏览

c# - 嵌套/子对象的自定义 XmlSerialization

我有一个场景,其中我有一个 Resource 类,其中嵌套了另外两个类;操作和资源 URL。我需要为 Resource 和 Action 而不是为 ResourceURL 编写自定义 xmlserializer。我为两者实现了 IXmlSerializable。

问题是,当 Resource 被序列化时,我调用 Action.WriteXML(XmlWriter) 来获取 Action 的序列化形式,但我无法获得 ResourceURL 的序列化形式。标签变得一团糟,它还添加了一个标签。

那么我如何序列化一个对象,该对象对某些嵌套对象具有客户序列化但对其他对象没有序列化?

0 投票
1 回答
1089 浏览

c# - 为包含带或不带 CDATA 标记的数据的内容实现 IXmlSerializable

我试图找出一种解析 xml 标记的方法,其中内容通过 CDATA 标记传递以获取某些输入,但不是全部。

例如,以下是我将收到的包含 CDATA 标记的数据的示例内容。但是还有一些其他情况会省略 CDATA 标记。

有没有一种优雅的方法可以以某种方式检测到这一点,并实现可以解析两种类型的输入(有或没有 CDATA)的 ReadXml 方法?到目前为止,我的 ReadXml() 实现如下,但是在省略 CDATA 标记时解析错误。

0 投票
2 回答
1843 浏览

serialization - 如果数据表包含拒绝序列化的对象,如何保存它?

我将来自 Google API 的 GData“事件”对象存储在数据表中(好吧,我必须将它们转换为对象,否则它们不会进入),我可以完美地访问事件的所有属性,并使用他们更新谷歌,但我无法将数据表(或父数据集)序列化为文件,因为:

类型 'Google.GData.Calendar.EventEntry, Google.GData.Calendar, Version=1.4.0.2, Culture=neutral, PublicKeyToken=aa6748391206b888' 没有实现 IXmlSerializable 接口,因此无法进行序列化。

无论我尝试简单地序列化为 XML 还是二进制,都会发生这种情况,而且我找不到解决问题的方法;不能以一种或另一种方式将任何数据结构保存到文件中吗?

为了设置上下文,我最初将 GData EventFeed 保存为 XML,这需要大约 30 秒才能使用 Google API 的 myEventFeed.saveToXML 弄清楚,我想我稍后再重新加载它......我花了两天时间试图获取 xml回到 EventFeed 对象,现在已切换到将 EventEntry 从 EventFeed 保存到数据表。

所以我设法轻松地将 Feed 保存到 XML 1.0,但是将它读回 GData EventFeed 是另一回事 - 谷歌给你 myFeed.saveToXML 但没有 loadfromXML 方法:-/ 所以我最终尝试添加 System.Runtime.Serialization使用类似的东西:

Dim reader As XmlReader = XmlReader.Create(fileName) Dim rssFeed As SyndicationFeed = SyndicationFeed.Load(reader)

起初这看起来很有希望,但数据并不全部都在 rssFeed 中,而且我仍然必须将数据返回到 Google.GData.Calendar.EventFeed 才能调用我需要的方法,但我不能弄清楚如何做到这一点。我想可以将最重要的数据位从 rssFeed 复制到新的 EventEntry 中,或者通过提取重要数据来对数据表做同样的事情……但这会很不雅,而且很冒险。

有什么想法我现在应该转向吗?我在吠叫错误的树吗?

谢谢,尼尔

VB .NET 3.5 VS 2008

0 投票
1 回答
727 浏览

c# - 实现 IXmlSerializable 接口时处理字符串的空值

我有以下实现 IXmlSerializable 的类。在实现 WriteXml() 时,我需要处理此类的字符串成员可能为空值的情况。处理此问题的最佳方法是什么?

目前,我正在使用默认构造函数,其中所有字符串属性都初始化为空字符串值。这样,当调用 WriteXml() 时,字符串不会为空。

我可以做到这一点的另一种方法是在将每个字符串写入 xml 之前使用 String.IsNullOrEmpty 检查。

关于如何改进此代码的任何建议?

0 投票
2 回答
1537 浏览

vb.net - IXmlSerializable 字典问题

我试图创建一个Dictionary实现的泛型IXmlSerializable感谢 Charles Feduke)。

这是我的试验:

结果:

我在 WriteXml 方法的顶部放置了一个断点,我看到当它停止时,编写器根本不包含任何数据,恕我直言,它应该包含根元素和 xml 声明。


0 投票
1 回答
95 浏览

xml-serialization - 有没有办法让序列化成员序列化为属性?

有没有办法让序列化成员序列化为属性:

我希望当这个类被 xml 序列化时,它应该产生:

我的意思是,不应将 Name 属性序列化为元素,而应将其序列化为 xml 属性。