Tag: xmlserializer

XmlSerializer和可空属性

我有一个具有许多Nullable 属性的类,我想将其作为属性序列化为XML。 这显然是禁忌,因为它们被认为是“复杂类型”。 所以,我实现了* Specified模式,我在其中创建了一个add * Value和* Specified属性,如下所示: [XmlIgnore] public int? 年龄 { 得到{return this.age; } 设置{this.age = value; } } [XmlAttribute( “年龄”)] public int AgeValue { 得到{return this.age.Value; } 设置{this.age = value; } } [XmlIgnore] public bool AgeValueSpecified { 得到{return this.age.HasValue; } } 哪个工作正常 – 如果’Age’属性有值,则将其序列化为属性。 如果它没有值,则不会序列化。 问题在于,正如我所提到的,我的class级中有很多Nullable-s,这种模式只是让事情变得混乱和无法管理。 我希望有一种方法可以使Nullable更友好的XmlSerializer。 或者,如果失败了,那就是创建Nullable替换的方法。 有没有人有任何想法我怎么能这样做? 谢谢。

使用未知字段反序列化XML – 会发生什么?

我们开发了一个使用XML与Microsoft Dynamics AX“对话”的应用程序。 遗憾的是,XML格式没有记录,但在我之前处理项目的人只是从文件中提取了一个XSD架构,我们在从AX反序列化数据时进行了validation。 我们现在唯一的问题是,客户端经常在AX中添加新字段 – 这自然会破坏架构。 他们希望我们完全关闭validation(“我们不希望每次添加新字段时都依赖于你来尝试一些东西!”),我强烈反对。 但真的会有负面影响吗? 也就是说,只要添加新值,XmlSerializer是否会实际上搞乱现有值? 我发现测试所有假设场景几乎是不可能的,这就是我在这里问的原因…… 一个具体的例子是这样的格式: Foo 1234 假设现在他们添加了这样的新字段,但是不删除现有值: Foo 9876 1234 Bar 我们能否正确地解析A和B(在这个或其他变体中)? 谢谢。

更好的IXmlSerializable格式?

我有一个接口IInput阻止XmlSerializer本地序列化类(因为它不喜欢接口)。 我发现了一个黑客/解决方法,它试图在反序列化时创建底层实现,然后将其转换回接口。 反序列化器知道底层实现,因为它被编码为AssemblyQualifiedName属性 为了利用这种技术,我必须实现IXmlSerializable,但只有1个属性真的需要帮助( II输入输入 ),我希望所有其他属性的行为就像它们是正常的一样。 这是我的类,它按预期工作,但似乎是一种非常混乱的方式获取普通XMLserializer可以序列化以符合IXmlSerialiable接口的类型。 是否存在某种“除x之外本地序列化所有属性”? 如果不是,我可以通过什么方式使其更具可读性和/或更少的复制和粘贴 public class JobInput : IJobInput, IXmlSerializable { public int AgencyId { get; set; } public Guid ExternalId { get; set; } public string Requester { get; set; } public IInput Input { get; set; } public XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) […]

如何在反序列化时将XML节点值作为字符串获取

我正在向aspnet核心web api发送XML。 名称空间前缀cfdi:值在包含节点中定义: 为了反序列化,我创建了Comprobante类: public class Comprobante : IValidatableObject { [Required] [XmlArray(“Conceptos”), XmlArrayItem(typeof(Concepto), ElementName = “Concepto”)] public List Conceptos { get; set; } public Addenda Addenda { get; set; } } 一切都映射到类属性,但Addenda节点可以接收任何东西 – 任意数量的有效XML节点 – 所以我没有类定义。 即Addenda节点可能包含我不知道的n个节点,信息在接收端validation。 例如,客户可以要求添加带有采购订单编号的节点,另一个客户可以要求提供买方名称。 等等。 如果我需要将所有Addenda节点内容作为字符串,我应该如何在类中声明它?

如何使用XmlSerializer反序列化大型文档中的节点

我有一个大型的XML文档,我已经加载到XmlDocument ,我想使用XmlSerializer类将所选元素反序列化为使用xsd.exe生成的.NET类。 这是迄今为止我尝试过的MCVE; xsd和生成的类位于post的末尾。 正如代码中的注释所述,我收到了一个InvalidOperationException – was not expected : static string XmlContent = @” “; static void TestMcve() { var doc = new XmlDocument(); doc.LoadXml(XmlContent); var nsMgr = new XmlNamespaceManager(doc.NameTable); nsMgr.AddNamespace(“myns”, “http://MyNamespace”); var rootSerializer = new XmlSerializer(typeof(RootNode)); var root = (RootNode) rootSerializer.Deserialize(new XmlNodeReader(doc)); Console.WriteLine(root.Cars[0].make); // Works fine so far var node = doc.DocumentElement.SelectSingleNode(“myns:Cars”, nsMgr); […]

XSD.EXE + JSON.NET – 如何处理xxxSpecified生成的成员?

当使用XSD.EXE从XML Schema生成类时,它会生成给定对象的任何基元的xxxSpecified成员: ….产生: public class Foo { public int Count { get; set; } public bool CountSpecified { get; set; } } 看来最新版本的JSON.NET可以在反序列化时自动设置这些属性。 string request = “{ Count : 10 }”; var object = JsonConvert.Deserialize(request) Assert.IsTrue(object.Count = 10); // Yup Assert.IsTrue(object.CountSpecified == true); //Also yup – JSON.NET works! 但是,当采用另一种方式时,xxxSpecified属性包含在JSON输出中,这是不正确的,因为它不是模式的一部分。 string request = JsonConvert.Serialize(object); //{ // […]

XmlSerializer是否会创建空文档

好的,下面的代码我已经生产了一年多没有变化。 它一直运作良好。 在过去一个月内,少数机器报告xml文档完全为空。 它们甚至不包含xml标头。 我无法复制突然空的文件,我也无法建议它发生的方式。 我希望有人有类似的问题,他们解决了。 大多数使用此代码的机器已经使用了大约一年,如果不是更多的话。 用于在其中包含数据和列表的空文件。文件不会同时序列化。 在程序退出之前,一个接一个地保存/序列化。 我的问题:下面的代码是否有可能创建一个空文件? 还有什么会导致他们突然变空? 有没有其他人在过去一个月中遇到过XML-serializer的问题? (这个问题仅发生在过去一个月中,已经稳定3个月以上的版本。) 如果您有疑问或我遗失了什么请问。 还有各种各样的类型,我序列化…所以如果你可以想象它我可能有一些类似的序列化。 public class BackEnd { public string FileSaveLocation = “this gets set on startup”; public bool DisabledSerial; public virtual void BeforeDeserialize() { } public virtual void BeforeSerialize() { } public virtual void OnSuccessfulSerialize() { } protected virtual void OnSuccessfulDeserialize(ListBackEnd tmpList) { […]

XmlSerializer – 忽略inheritance的不可序列化成员

假设您有两个类,一个inheritance另一个,并且需要使用XmlSerializer对子进行序列化/反序列化。 但是,父级包含一个不可序列化的成员,比如字典。 public class Parent { public Dictionary dictionary; } 父类是用于许多其他脚本的库。 它无法修改。 现在子类只包含可序列化的成员: public class Child : Parent { [XmlElement] public int foo; } 尝试调用序列化程序时,我收到一条错误,指出该字典不可序列化。 在尝试使用JSON进行序列化时,我设法以警告的价格逃脱。 我刚刚创建了另一个具有相同名称和类型的成员,并使用了ScriptIgnore: public class Child : Parent { public int foo; [ScriptIgnore] public Dictionary dictionary; } 我在这里再次尝试了相同的技巧(通过使用XmlIgnore),但这不能很好地工作,错误是相同的。 我设法完成此操作的唯一方法是创建单独的类,它们只提供xml de / serializing,然后将值复制回适当的位置。 有没有人知道更好的解决方法? 我能否以任何方式让XmlSerializer忘记父词典?

Xml反序列化附加到列表中

我正在尝试从xml文件反序列化一些设置。 有问题的属性/底层字段是一个名为AlertColors字段。 我将基础字段初始化为白色,黄色和红色,以确保此类的新实例具有有效的颜色设置。 但是当我反序列化时, _colorArgb以六个值结束,前三个是初始化值,后三个是从xml文件中读取的值。 但属性AlertColors不会附加到该字段,但会更改其元素。 为什么我最终得到六种颜色的场? 这是代码: private List _colorArgb = new List(new int[] { Color.White.ToArgb(), Color.Yellow.ToArgb(), Color.Red.ToArgb() }); public List AlertColors { get { return _colorArgb; } set { for (int i = 0; i < Math.Min(_colorArgb.Count, value.Count); i++) { if (_colorArgb[i] != value[i]) { HasChanged = true; } } _colorArgb = value; […]

如何通过c#中的XML序列化输出hex数?

我有一些类和结构,我使用XML序列化来保存和调用数据,但我想要的一个function是以hex表示forms输出整数。 是否有任何属性可以挂在这些结构上以实现这一目标?