我在反序列化方面遇到了一些麻烦。
<Order>
...
<CardNumber />
...
</Order>
如果我使用
<CardNumber>00000000-0000-0000-0000-000000000000</CardNumber>
它正常工作,但是如果我只使用<CardNumber />
- 对象没有反序列化(
有没有办法将空元素反序列化为Guid.Empty?
应使用此元素的值映射的属性:
[XmlElement(ElementName = "CardNumber")]
[JsonProperty("CardNumber")]
public Guid? CardNumber { get; set; }
JSON中的相同情况正常工作并使用Guid.Empty而不是空元素值
{
"CardNumber": ""
}
答案 0 :(得分:3)
Null与Guid.Empty
不同。在JSON序列化程序中,您使用空字符串表示null。
如果您使用XmlSerializer
序列化课程,则会看到它使用xsi:nil="true"
来表示空值。
例如:
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<CardNumber xsi:nil="true" />
</Order>
答案 1 :(得分:1)
您看到的例外情况清楚地解释了问题:
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
。因此,您需要使用代理属性手动进行转换:
[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?
属性的许多不同类型中执行此操作,则可以提取代理类型,如下所示:
[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; }
}
我在这里利用XmlElementAttribute.Type
属性会自动从Guid?
中选择XmlGuid
为class StoreListingModal: Mappable {
var store: [StoreModal]?
var status: String?
required init?(_ map: Map){
}
func mapping(map: Map) {
store <- map["result"]
status <- map["status"]
}
}
定义的事实。