我有一個自定義串列,用于具有BindingList<T>XML 可序列化的功能。SBindingList<T>課程如下:
public class SBindingList<T> : BindingList<T>, IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.Read();
XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
List<T> ts = (List<T>)serializer.Deserialize(reader);
foreach (T item in ts)
{
Add(item);
}
}
public void WriteXml(XmlWriter writer)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
serializer.Serialize(writer, this.ToList());
}
}
這個想法是像List<T>在幕后一樣讀取和寫入 XML,但仍然可以像BindingList<T>. 我遇到的問題是它開始讀取<Games>然后Add(item);開始反序列化<AvailableQuests>。因為<AvailableQuests>是空的,所以它只是掉出,ReadXml但在完成添加后立即回傳,甚至沒有接觸or<Games>就掉出。, ,和都是s 。另請注意,出于隱私原因,我編輯了所有 ID。只需將標簽替換為 any 。ReadXml<Characters><ActiveQuests><Games><AvailableQuests><Characters><ActiveQuests>SBindingList<T>[blah]ulong
<Games>
<ArrayOfGame xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Game GuildID="[GuildID]" BotChannel="0" QuestChannel="0">
<AvailableQuests>
<ArrayOfQuest />
</AvailableQuests>
<Characters>
<ArrayOfCharacter>
<Character Name="The Real Dirty Dan" Class="Meme" Level="17"
OwnerID="[Owner1]" Busy="false" />
<Character Name="Bob" Class="Builder" Level="2" OwnerID="[Owner2]"
Busy="false" />
</ArrayOfCharacter>
</Characters>
<ActiveQuests>
<ArrayOfQuest />
</ActiveQuests>
</Game>
</ArrayOfGame>
</Games>
這是物件設定以防有人需要它:
public class Game
{
/// <summary>
/// Only for serialization
/// </summary>
public Game() { }
public Game(ulong guildID)
{
GuildID = guildID;
}
/// <summary>
/// What discord server is the game on
/// </summary>
[XmlAttribute]
public ulong GuildID { get; set; }
[XmlAttribute]
public ulong BotChannel { get; set; }
[XmlAttribute]
public ulong QuestChannel { get; set; }
public SBindingList<Quest> AvailableQuests { get; set; } = new SBindingList<Quest>();
public SBindingList<Character> Characters { get; set; } = new SBindingList<Character>();
public SBindingList<Quest> ActiveQuests { get; set; } = new SBindingList<Quest>();
public string Test { get; set; } // This gets ignored too
public Character GetCharacterByName(string name)
{
return (from c in Characters
where c.Name == name
select c).FirstOrDefault();
}
}
我真的不知道從哪里開始。我嘗試過使用一個List<T>或一次只閱讀T一個,但兩種方式最終都忽略了所有其他元素。我唯一的猜測是我需要用 清理一些東西,reader然后才能讓它掉下來ReadXmllike reader.FinishedReading()。
uj5u.com熱心網友回復:
如果reader在除下一個元素之外的任何其他元素上,則閱讀器放棄對物件的其余部分進行反序列化。換句話說,閱讀器必須在下一個元素(在本例中為Character元素)上才能繼續反序列化<Game>標簽。在這種情況下,可以使用reader.Skip()then來修復它reader.ReadEndElement()
uj5u.com熱心網友回復:
答案在于以下檔案ReadXml:
呼叫此方法時,閱讀器位于包裝您的型別資訊的開始標記上。也就是說,直接在指示序列化物件開始的開始標記上。當此方法回傳時,它必須從頭到尾讀取整個元素,包括其所有內容。與該
WriteXml方法不同,框架不會自動處理包裝元素。
您似乎已經通過reader.Read()在開始時呼叫(移過開始標記并進入內容)發現了這一點,但最后您還沒有。解決方法是之后再次呼叫reader.Read()。
也許更好的方法是先打電話reader.ReadStartElement(),reader.ReadEndElement()最后打電話。這只是在內部呼叫reader.Read(),但如果閱讀器未處于預期狀態,它將引發例外。
我還建議共享一個靜態序列化程式實體,而不是在每次讀取或寫入串列時創建一個新實體。所以這應該作業:
public class SBindingList<T> : BindingList<T>, IXmlSerializable
{
private static readonly XmlSerializer Serializer = new XmlSerializer(typeof(List<T>));
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
reader.ReadStartElement();
var items = (List<T>)Serializer.Deserialize(reader);
foreach (T item in items)
{
Add(item);
}
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
Serializer.Serialize(writer, this.ToList());
}
}
uj5u.com熱心網友回復:
嘗試以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication23
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlReader reader = XmlReader.Create(FILENAME);
XmlSerializer serializer = new XmlSerializer(typeof(Games));
Games games = (Games)serializer.Deserialize(reader);
}
}
public class Games
{
[XmlArray(ElementName = "ArrayOfGame")]
[XmlArrayItem(ElementName = "Game")]
public List<Game> game { get; set; }
}
public class Game
{
[XmlAttribute()]
public string GuildID { get; set; }
[XmlAttribute()]
public int BotChannel { get; set; }
[XmlAttribute()]
public int QuestChannel { get; set; }
[XmlArray(ElementName = "AvailableQuests")]
[XmlArrayItem(ElementName = "ArrayOfQuest")]
public List<Quest> availableQuest { get; set; }
[XmlElement(ElementName = "Characters")]
public Characters characters { get; set; }
[XmlArray(ElementName = "ActiveQuests")]
[XmlArrayItem(ElementName = "ArrayOfQuest")]
public List<Quest> activeQuest { get; set; }
public class Quest
{
}
public class Characters
{
[XmlArray(ElementName = "ArrayOfCharacter")]
[XmlArrayItem(ElementName = "Character")]
public List<Character> character { get; set; }
}
public class Character
{
[XmlAttribute()]
public string Name { get; set; }
[XmlAttribute()]
public string Class { get; set; }
[XmlAttribute()]
public int Level { get; set; }
[XmlAttribute()]
public string OwnerID { get; set; }
[XmlAttribute()]
public Boolean Busy{ get; set; }
}
public class ArrayOfQuest
{
}
}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/462423.html
