第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

XML 未反序列化為正確的類,并且之后未使用 xsi:type 屬性進(jìn)行序列化

XML 未反序列化為正確的類,并且之后未使用 xsi:type 屬性進(jìn)行序列化

C#
吃雞游戲 2023-07-22 16:02:13
在下面的代碼片段中,我嘗試反序列化在Animal記錄上具有類型屬性的 XML,將它們標(biāo)識為Cat或Dog,兩者都繼承自Animal。反序列化時,這些記錄全部顯示為Animal.然后,當(dāng)嘗試序列化該對象時(反序列化之后), 和xsi:type="Dog"不會xsi:type="Cat"出現(xiàn)在 XML 中。我不確定這是否是由于我如何裝飾類或在我的序列化器/反序列化器實現(xiàn)中造成的。如果可能的話,首選類中的解決方案而不是序列化器/反序列化器包裝方法。代碼:using System;  using System.IO; using System.Text;using System.Xml;using System.Xml.Serialization; namespace sandbox{    public partial class Program    {        static void Main(string[] args)        {             string xml =                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +                "<OuterClass xmlns=\"http://myschema.com/\">" +                "   <Animals>" +                "      <Animal xmlns:xsi=\"http://myschema.com/\" xsi:type=\"Dog\">" +                "         <Name>Watson</Name>" +                "         <Height>10</Height>" +                "         <Weight>10</Weight>" +                "         <Paws>4</Paws>" +                "         <Woof>True</Woof>" +                "      </Animal>" +                "      <Animal xmlns:xsi=\"http://myschema.com/\" xsi:type=\"Cat\">" +                "         <Name>Hermy</Name>" +                "         <Height>10</Height>" +                "         <Weight>10</Weight>" +                "         <Paws>4</Paws>" +                "         <Meow>True</Meow>" +                "      </Animal>" +                "   </Animals>" +                "</OuterClass>";            OuterClass data = null;            try            {                data = DeserializeXml<OuterClass>(xml);                foreach (Animal curr in data.Animals) Console.WriteLine(curr.Name + ": " + curr.GetType().ToString());            }            catch (Exception e)            {                Console.WriteLine(e.ToString());                Console.WriteLine(e.Message);            }            Console.WriteLine(SerializeXml(data));            Console.ReadLine();         }
查看完整描述

2 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊

您的示例中有幾個問題:

  • 該模型與 xml 不匹配

  • 每個 Animal 元素都會覆蓋 xsi 命名空間

  • 序列化不支持布爾值

請在下面找到有關(guān)問題的更多詳細(xì)信息:

1.模型與xml不匹配

當(dāng)您指定XmlArrayItem?XmlSerializer時,將使用類型名稱作為元素名稱,或者您可以通過顯式提供ElementName來更改它。如果您使用注釋數(shù)組屬性,XmlArrayItem您將得到以下輸出:

Console.WriteLine(SerializeXml(new OuterClass { Animals = new Animal[] { new Cat(), new Dog() } }));


<OuterClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://myschema.com/">

? <Animals>

? ? <Cat>

? ? ? <Height>0</Height>

? ? ? <Weight>0</Weight>

? ? ? <Paws>0</Paws>

? ? ? <Meow>false</Meow>

? ? </Cat>

? ? <Dog>

? ? ? <Height>0</Height>

? ? ? <Weight>0</Weight>

? ? ? <Paws>0</Paws>

? ? ? <Woof>false</Woof>

? ? </Dog>

? </Animals>

</OuterClass>

如果不注釋,您將獲得 xsi:type 屬性定義的類型的輸出:


<OuterClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://myschema.com/">

? <Animals>

? ? <Animal xsi:type="Cat">

? ? ? <Height>0</Height>

? ? ? <Weight>0</Weight>

? ? ? <Paws>0</Paws>

? ? ? <Meow>false</Meow>

? ? </Animal>

? ? <Animal xsi:type="Dog">

? ? ? <Height>0</Height>

? ? ? <Weight>0</Weight>

? ? ? <Paws>0</Paws>

? ? ? <Woof>false</Woof>

? ? </Animal>

? </Animals>

</OuterClass>

XmlInclude在這種情況下,您必須向基類添加屬性。

2. 每個 Animal 元素都會覆蓋 xsi 命名空間

http://www.w3.org/2001/XMLSchema-instance是W3C中定義的特殊命名空間,可幫助序列化程序了解 XML 元素中的類型。在您的輸入 xml 中,每個 Animal 元素都會使用自定義的http://myschema.com/覆蓋此名稱空間,因此當(dāng)序列化程序遇到它時xsi:type="Cat",它不知道它的含義。維基百科是了解 XML 命名空間的一個很好的起點:https://en.wikipedia.org/wiki/XML_namespace

3. XML 中的布爾值

W3C 將布爾數(shù)據(jù)類型定義為“true”、“false”、“0”和“1”,因此如果您使用值“?True?”反序列化布爾值,則會出現(xiàn)異常。您可能會在網(wǎng)上找到解決方法,但我認(rèn)為您的輸入 XML 格式錯誤,您需要將 XML 中的布爾值小寫。


查看完整回答
反對 回復(fù) 2023-07-22
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊

您需要正確創(chuàng)建類:


            OuterClass outerClass = new OuterClass()

            {

                Animals = new Animal[] {

                    new Dog() { Name = "Watson", Height = 10, Weight = 10, Paws = 4},

                    new Cat() { Name = "Hermy", Height = 10, Weight = 10, Paws = 4}

                }

            };


查看完整回答
反對 回復(fù) 2023-07-22
  • 2 回答
  • 0 關(guān)注
  • 197 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號