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

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

實現(xiàn)IXmlSerialable的正確方法?

實現(xiàn)IXmlSerialable的正確方法?

C#
開滿天機 2019-06-28 10:16:22
實現(xiàn)IXmlSerialable的正確方法?一旦程序員決定實現(xiàn)IXmlSerializable,實施它的規(guī)則和最佳做法是什么?我聽說過GetSchema()應(yīng)該回來null和ReadXml應(yīng)該在返回之前移到下一個元素。這是真的嗎?那又是怎么回事呢?WriteXml-是為對象編寫根元素,還是假定根已經(jīng)寫入?如何處理和編寫子對象?這是我現(xiàn)在的一個樣本。我會更新它,因為我得到了良好的反應(yīng)。public class MyCalendar : IXmlSerializable{     private string _name;     private bool _enabled;     private Color _color;     private List<MyEvent> _events = new List<MyEvent>();     public XmlSchema GetSchema() { return null; }     public void ReadXml(XmlReader reader)     {         if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyCalendar")         {             _name    = reader["Name"];             _enabled = Boolean.Parse(reader["Enabled"]);             _color   = Color.FromArgb(Int32.Parse(reader["Color"]));             if (reader.ReadToDescendant("MyEvent"))             {                 while (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "MyEvent")                 {                     MyEvent evt = new MyEvent();                     evt.ReadXml(reader);                     _events.Add(evt);                 }             }             reader.Read();         }     }     public void WriteXml(XmlWriter writer)     {         writer.WriteAttributeString("Name",    _name);         writer.WriteAttributeString("Enabled", _enabled.ToString());         writer.WriteAttributeString("Color",   _color.ToArgb().ToString());         foreach (MyEvent evt in _events)         {             writer.WriteStartElement("MyEvent");             evt.WriteXml(writer);             writer.WriteEndElement();         }     }}public class MyEvent : IXmlSerializable{     private string _title;     private DateTime _start;     private DateTime _stop;
查看完整描述

3 回答

?
回首憶惘然

TA貢獻1847條經(jīng)驗 獲得超11個贊

是,GetSchema()應(yīng)該返回空.

IXmlSerializable.GetSchema方法此方法是保留的,不應(yīng)使用。在實現(xiàn)IXmlSerialable接口時,應(yīng)從此方法返回一個空引用(在VisualBasic中為Nothing),如果需要指定自定義架構(gòu),則應(yīng)將XmlSchemaProviderAttribute應(yīng)用于該類。

對于讀和寫,對象元素已經(jīng)寫好了,所以您不需要在寫中添加外部元素。例如,您可以在這兩個屬性中開始讀取/寫入屬性。

為寫:

您提供的WriteXml實現(xiàn)應(yīng)該寫出對象的XML表示。該框架編寫一個包裝器元素,并在其啟動后定位XML編寫器。您的實現(xiàn)可以編寫其內(nèi)容,包括子元素。然后,框架關(guān)閉包裝器元素。

而為了朗讀,閱讀:

ReadXml方法必須使用WriteXml方法編寫的信息重新構(gòu)造對象。

調(diào)用此方法時,讀取器位于包裝類型信息的元素的開頭。也就是說,就在表示序列化對象的開始標(biāo)記之前。當(dāng)此方法返回時,它必須從頭到尾讀取整個元素,包括其所有內(nèi)容。與WriteXml方法不同,框架不會自動處理包裝器元素。您的實現(xiàn)必須這樣做。不遵守這些定位規(guī)則可能會導(dǎo)致代碼產(chǎn)生意外的運行時異?;驌p壞的數(shù)據(jù)。

我同意這一點有點不清楚,但歸根結(jié)底是“這是你的工作Read()包裝器的結(jié)束元素標(biāo)記“。


查看完整回答
反對 回復(fù) 2019-06-28
?
莫回?zé)o

TA貢獻1865條經(jīng)驗 獲得超7個贊

我想補充一點,在我從事的一個項目中,我們發(fā)現(xiàn)手動編寫外部XML元素是很尷尬的,這也會導(dǎo)致相同類型的對象的XML元素名稱不一致。

我們的解決辦法是定義我們自己的IXmlSerializable接口,派生自SystemOne,其中添加了一個名為WriteOuterXml()..可以猜到,這個方法只需編寫外部元素,然后調(diào)用WriteXml(),然后編寫元素的結(jié)尾。當(dāng)然,SystemXML序列化程序不會調(diào)用此方法,因此只有在我們自己進行序列化時才會有用,因此在您的情況下可能會有幫助,也可能沒有幫助。類似地,我們添加了一個ReadContentXml()方法,它沒有讀取外部元素,只讀取其內(nèi)容。


查看完整回答
反對 回復(fù) 2019-06-28
  • 3 回答
  • 0 關(guān)注
  • 455 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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