jjzjj

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

coder 2024-06-26 原文

我在反序列化方面遇到了一些麻烦。

<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": ""
}

最佳答案

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

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 的事实属性自动选择 implicit conversion我为 Guid? 定义了从和到 XmlGuid

关于c# - 将空 XML 元素反序列化为 Guid.Empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38632331/

有关c# - 将空 XML 元素反序列化为 Guid.Empty的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  10. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

随机推荐