XML 反序列化忽略不按字母顺序排列的属性

     2023-04-12     200

关键词:

【中文标题】XML 反序列化忽略不按字母顺序排列的属性【英文标题】:XML deserialization ignores properties out of alphabetical order 【发布时间】:2016-06-16 20:16:42 【问题描述】:

我有一个小问题 - XML 反序列化完全忽略不按字母顺序排列的项目。在示例对象(问题末尾的描述)中,Birthday 节点在FirstName 节点之后,反序列化后它被忽略并分配默认值。任何其他类型和名称都相同(我在 PatientInfo 类型的节点 Patient 之后有 Guid 类型的节点 CaseId 类型,反序列化后它具有默认值)。

我正在使用下一个代码在一个应用程序中对其进行序列化:

public static string SerializeToString(object data)

    if (data == null) return null;
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    // what should the XmlWriter do?
    var settings = new XmlWriterSettings
    
        OmitXmlDeclaration = true,
        NewLineChars = ""
    ;

    using (var stringwriter = new System.IO.StringWriter())
    
        // Use an XmlWriter to wrap the StringWriter
        using (var xmlWriter = XmlWriter.Create(stringwriter, settings))
        
            var serializer = new XmlSerializer(data.GetType(), "");
            // serialize to the XmlWriter instance
            serializer.Serialize(xmlWriter, data, ns);
            return stringwriter.ToString();
        
    

这种方法用于获得正确的结果作为 WebMethod 的参数(完整的问题描述为here)。结果是这样的:

Foo2015-12-19T16:21:48.4009949+01:0000000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000

我也在以简单的方式在另一个应用程序中反序列化它

public static T Deserialize<T>(string xmlText)

    if (String.IsNullOrEmpty(xmlText)) return default(T);
    using (var stringReader = new StringReader(xmlText))
    
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    

示例对象:

[XmlRoot("PatientInfo")]
public class PatientInfo

    [XmlElement("FirstName")]
    public string FirstName  get; set; 
    [XmlElement("LastName")]
    public string LastName  get; set; 
    [XmlElement("SSN")]
    public string SSN  get; set; 
    [XmlElement("Birthday")]
    public DateTime? Birthday  get; set; 
    [XmlElement("RequestedClientID")]
    public Guid RequestedClientID  get; set; 
    [XmlElement("patientId")]
    public Guid patientId  get; set; 

所以,我想回答两个问题之一 - 1) 如何调整我的序列化以使所有项目按字母顺序排列? 2) 如何调整我的反序列化,使其不会忽略不按字母顺序排列的项目?

感谢任何帮助。

更新:

刚刚发现,我正在使用的反序列化方法实际上根本没有用于我的问题,因为我将序列化信息用作 WebMethod 的数据,并且它是通过 WCF 的一些内部机制进行反序列化的。

【问题讨论】:

看来,这种简单的方法是将对象类中的所有属性按顺序排列,但我会很恼火地为我添加到类中的每个新属性搜索适当的位置。 我无法重现您的问题。如果我颠倒 XML 中节点的顺序,它仍然会成功反序列化。见dotnetfiddle.net/xN5PSk @dbc 实际上,我似乎做了一个错误的陈述,而且它与 Web Method 一起使用这一事实比我想象的要重要得多。实际上,第二个应用程序在Web Method中接收数据,并通过某种内部机制对其进行反序列化,因此我的反序列化方法与此无关。抱歉造谣=( 【参考方案1】:

WCF uses DataContractSerializer。此序列化程序对 XML 元素顺序很敏感,请参阅 Data Member Order。 disable this 没有快捷方式,您需要将序列化程序替换为 XmlSerializer

为此,请参阅Using the XmlSerializer Class,然后将[XmlSerializerFormat] 应用于您的服务,例如:

[ServiceContract]
[XmlSerializerFormat]
public interface IPatientInfoService

    [OperationContract]
    public void ProcessPatientInfo(PatientInfo patient)
    
        // Code not shown.
    


[XmlRoot("PatientInfo")]
public class PatientInfo

    [XmlElement("FirstName")]
    public string FirstName  get; set; 
    [XmlElement("LastName")]
    public string LastName  get; set; 
    [XmlElement("SSN")]
    public string SSN  get; set; 
    [XmlElement("Birthday")]
    public DateTime? Birthday  get; set; 
    [XmlElement("RequestedClientID")]
    public Guid RequestedClientID  get; set; 
    [XmlElement("patientId")]
    public Guid patientId  get; set; 

【讨论】:

Gitbook章节参考书目不按字母顺序排列

】Gitbook章节参考书目不按字母顺序排列【英文标题】:Gitbookchapterbibliographynotinalphabeticalorder【发布时间】:2018-08-2916:04:21【问题描述】:我正在使用bookdown从Rmarkdown文件(即.Rmd)创建HTMLgitbook,默认选项为split_bib=TRUE,从而在每... 查看详情

C#,忽略 XML 反序列化的大小写敏感

】C#,忽略XML反序列化的大小写敏感【英文标题】:C#,IgnorecasesensitivityforXMLdeserialization【发布时间】:2020-02-2410:04:33【问题描述】:1.xml文件包含xml元素:“INSTITUTION”和“institution”,每个xml元素都包含名称、代码和INN等属性。... 查看详情

提交表单后不按字母顺序排序

】提交表单后不按字母顺序排序【英文标题】:Notsortingalphabeticallyaftersubmittheform【发布时间】:2017-06-2311:20:56【问题描述】:我已经对城市的下拉菜单进行了排序。它的排序正确,但是在单击提交按钮后,它们的顺序不是按字母... 查看详情

C# 在忽略命名空间的同时反序列化 xml

】C#在忽略命名空间的同时反序列化xml【英文标题】:C#deserializexmlwhileignoringnamespace【发布时间】:2021-02-1702:51:31【问题描述】:我必须将Xml文件加载并反序列化为对象。我可以读取xml,到达描述对象的位置并仅从该部分解析xml... 查看详情

Android Studio 中的 XML 属性排列

...排序:查看ID风格布局宽度和布局高度其他layout_属性,按字母顺序排序其余属性,按字母顺序排序例子:<Buttonandr 查看详情

反序列化时忽略属性

】反序列化时忽略属性【英文标题】:Ignoringpropertywhendeserializing【发布时间】:2013-04-0720:12:41【问题描述】:我有一个简单的接口,其中包含属性的getter和setter。publicinterfaceHasMoneyMoneygetMoney();voidsetMoney(Moneymoney);我有另一个类UserA... 查看详情

SharpSerializer:从反序列化中忽略属性/属性

】SharpSerializer:从反序列化中忽略属性/属性【英文标题】:SharpSerializer:Ignoreattributes/propertiesfromdeserialization【发布时间】:2021-12-1818:00:38【问题描述】:我正在使用SharpSerializer序列化/反序列化对象。我希望能够在反序列化时忽... 查看详情

在 Java 中的 Jackson JSON 反序列化期间忽略丢失的属性

】在Java中的JacksonJSON反序列化期间忽略丢失的属性【英文标题】:IgnoremissingpropertiesduringJacksonJSONdeserializationinJava【发布时间】:2014-01-0122:48:42【问题描述】:在示例中classPersonStringname;intage;如果JSON对象缺少属性“年龄”,"name":"... 查看详情

用于在反序列化期间忽略未知属性的 SpringMVC 全局设置

】用于在反序列化期间忽略未知属性的SpringMVC全局设置【英文标题】:SpringMVCglobalsettingforignoringunknownpropertiesduringdeserialization【发布时间】:2021-11-0202:58:27【问题描述】:SpringBoot默认设置“spring.jackson.deserialization.fail-on-unknown-prop... 查看详情

反序列化 xml 时忽略未知类型

】反序列化xml时忽略未知类型【英文标题】:Ignoreunknowntypeswhendeserializingxml【发布时间】:2012-10-1915:37:53【问题描述】:我有这个代码:[XmlType("Metadata")][Serializable]publicclassMetadataContainer:List<MetadataBase>[XmlType("Meta")][XmlInclude(type 查看详情

在使用 Jackson 反序列化期间选择性地忽略 JSON 属性

】在使用Jackson反序列化期间选择性地忽略JSON属性【英文标题】:SelectivelyignoringJSONpropertiesduringdeserializewithJackson【发布时间】:2014-06-1319:01:52【问题描述】:我想在反序列化阶段选择性地忽略JSON属性。我目前正在处理一个巨大... 查看详情

在C#中序列化和反序列化之间保留xml元素的顺序

】在C#中序列化和反序列化之间保留xml元素的顺序【英文标题】:RetainingorderofthexmlelementsbetweenserializationanddeserializationinC#【发布时间】:2014-06-0210:50:39【问题描述】:我已经从Xml模式生成了一个C#类。此类用于执行以下操作的工... 查看详情

使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性

】使用带有ItemRequired=Required.Always的Json.Net反序列化时忽略属性【英文标题】:IgnoreapropertywhendeserializingusingJson.NetwithItemRequired=Required.Always【发布时间】:2015-06-2215:51:12【问题描述】:我正在使用Json.Net将类序列化和反序列化为json... 查看详情

xml购买(全部),按字母顺序排列。疯狂。mtp。(代码片段)

查看详情

从一个属性中按字母顺序排列核心数据实体列表 - SwiftUI

】从一个属性中按字母顺序排列核心数据实体列表-SwiftUI【英文标题】:OrderalistofCoreDataentitiesalphabeticallyoffoneattribute-SwiftUI【发布时间】:2021-01-1618:30:22【问题描述】:我的项目中有两个实体,DBTeam和DBPlayer。DBTeam与DBPlayer具有一... 查看详情

为啥 Swiftui 中主线程不按顺序排列

】为啥Swiftui中主线程不按顺序排列【英文标题】:WhythemainthreadisnotinsequenceinSwiftui为什么Swiftui中主线程不按顺序排列【发布时间】:2020-09-2001:23:30【问题描述】:我在SwiftUI中有以下功能。JSON正在解析正确的数据,但顺序是:P1... 查看详情

在不更改属性顺序的情况下获取 XML

...此,因为我正在散列文档我正在尝试下面的代码,但它按字母顺序排列属性FilefXmlFile=newFile("C:\\\\ 查看详情

反序列化带有属性的 XML 数组

】反序列化带有属性的XML数组【英文标题】:DeserializinganXMLarraywithattributes【发布时间】:2021-11-1212:10:53【问题描述】:我必须使用工具中的xml。在xml中是这部分:<profile><detailsenvironment="sd98qlx"severity="critical"><detailunit="... 查看详情