将空的XML元素反序列化为Guid.Empty [英] Deserialize empty XML element as Guid.Empty

查看:93
本文介绍了将空的XML元素反序列化为Guid.Empty的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我反序列化有些麻烦.

<Order>
    ...
    <CardNumber />
    ...
</Order>

如果我使用

<CardNumber>00000000-0000-0000-0000-000000000000</CardNumber>

它正常工作,但是如果我仅使用<CardNumber />-对象未反序列化(

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

有什么办法可以将空元素反序列化为Guid.Empty吗?

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

应该与该元素的值映射的属性:

Property which should be mapped with value of this element:

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

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

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

{
    "CardNumber": ""
}

推荐答案

您看到的异常清楚地说明了问题:

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)."

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

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:

[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);
        }
    }
}

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

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

[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 };
    }
}

并像这样使用它:

[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.

这篇关于将空的XML元素反序列化为Guid.Empty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆