热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将空XML元素反序列化为Guid.Empty-DeserializeemptyXMLelementasGuid.Empty

Ihavesometroubleswithdeserializing.我有一些反序列化的麻烦。<Order><CardNumber>

I have some troubles with deserializing.

我有一些反序列化的麻烦。


    ...
    
    ...

If I use

如果我使用

00000000-0000-0000-0000-000000000000

it's working normally, but in case when I use just - object is not deserializing (

它正常工作,但是如果我只使用 - 对象没有反序列化(

Is there any way to deserialize empty element as Guid.Empty?

有没有办法将空元素反序列化为Guid.Empty?

Property which should be mapped with value of this element:

应该使用此元素的值映射的属性:

[XmlElement(ElementName = "CardNumber")]
[JsonProperty("CardNumber")]
public Guid? CardNumber { get; set; }

Same situation in JSON works normally and use Guid.Empty instead of empty element value

JSON中的相同情况正常工作并使用Guid.Empty而不是空元素值

{
    "CardNumber": ""
}

2 个解决方案

#1


1  

The exception you are seeing explains the problem clearly:

您看到的例外情况清楚地解释了问题:

System.InvalidOperationException occurred
  Message="There is an error in XML document (3, 3)."
  InnerException: System.FormatException
       Message="Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

As stated, XmlSerializer does not support deserializing an empty string to a Guid. Thus you will need to do the conversion manually using a surrogate property:

如上所述,XmlSerializer不支持将空字符串反序列化为Guid。因此,您需要使用代理属性手动进行转换:

[XmlRoot("Order")]
public class Order
{
    [XmlIgnore]
    [JsonProperty("CardNumber")]
    public Guid? CardNumber { get; set; }

    [XmlElement(ElementName = "CardNumber", IsNullable = true)]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    [JsonIgnore]
    public string XmlCardNumber
    {
        get
        {
            if (CardNumber == null)
                return null;
            else if (CardNumber.Value == Guid.Empty)
                return "";
            return XmlConvert.ToString(CardNumber.Value);
        }
        set
        {
            if (value == null)
                CardNumber = null;
            else if (string.IsNullOrEmpty(value))
                CardNumber = Guid.Empty;
            else
                CardNumber = XmlConvert.ToGuid(value);
        }
    }
}

If this is something you need to do in many different types that have Guid? properties, you can extract a surrogate type like so:

如果您需要在许多具有Guid的不同类型中执行此操作?属性,你可以提取代理类型,如下所示:

[XmlType(AnOnymousType= true, IncludeInSchema = false)]
public class XmlGuid
{
    [XmlIgnore]
    public Guid Guid { get; set; }

    [XmlText]
    public string XmlCardNumber
    {
        get
        {
            if (Guid == Guid.Empty)
                return null;
            return XmlConvert.ToString(Guid);
        }
        set
        {
            if (string.IsNullOrEmpty(value))
                Guid = Guid.Empty;
            else
                Guid = XmlConvert.ToGuid(value);
        }
    }

    public static implicit operator Guid?(XmlGuid x)
    {
        if (x == null)
            return null;
        return x.Guid;

    }

    public static implicit operator XmlGuid(Guid? g)
    {
        if (g == null)
            return null;
        return new XmlGuid { Guid = g.Value };
    }

    public static implicit operator Guid(XmlGuid x)
    {
        if (x == null)
            return Guid.Empty;
        return x.Guid;

    }

    public static implicit operator XmlGuid(Guid g)
    {
        return new XmlGuid { Guid = g };
    }
}

And use it like:

并使用它像:

[XmlRoot("Order")]
public class Order
{
    [XmlElement(Type = typeof(XmlGuid), ElementName = "CardNumber", IsNullable = true)]
    [JsonProperty("CardNumber")]
    public Guid? CardNumber { get; set; }
}

Here I am taking advantage of the fact that the XmlElementAttribute.Type property automatically picks up the implicit conversion I defined for Guid? from and to XmlGuid.

在这里,我利用了XmlElementAttribute.Type属性自动获取我为Guid定义的隐式转换这一事实?来自和到XmlGuid。

#2


3  

Null is not the same as Guid.Empty. In the JSON serializer, you denote null using an empty string.

Null与Guid.Empty不同。在JSON序列化程序中,您使用空字符串表示null。

If you serialize your class using XmlSerializer you'll see it uses xsi:nil="true" to denote a null value.

如果使用XmlSerializer序列化类,您将看到它使用xsi:nil =“true”来表示空值。

For example:

例如:


  


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
紫色咖啡调
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有