IXmlSerializable
Не могли бы вы, ребята, помочь мне, у меня есть проблема с десериализацией через IXmlSerializable
var ArrayOfAccounts = new Accounts(); //This class structure I'm trying to read
Class Accounts:List<Session>{ }
Class Shedule{
public DateTime StartAt { get; set; }
public DateTime EndAt { get; set; }
}
Class Session:IXmlSerializable {
public string Name{get;set;}
public string Pass{get;set;}
public List<Shedule> Shedules = new List<Shedule>();
public void ReadXml(System.Xml.XmlReader reader){
//AND HERE IS A PROBLEM. I don't know how to implement right code here. I've tried
//code below, but this one works for the first account only, and doesn't restore others
Schedules.Clear();
XmlReader subR = reader.ReadSubtree();
if (reader.MoveToAttribute("Name"))
Name = reader.Value;
if (reader.MoveToAttribute("Password"))
Password = reader.Value;
reader.MoveToContent();
while (subR.ReadToFollowing("Schedule"))
{
XmlSerializer x = new XmlSerializer(typeof(Schedule));
object o = x.Deserialize(subR);
if (o is Schedule) Schedules.Add((Schedule)o);
}
}
И сам XML выглядит так:
<Accounts>
<Session UserName="18SRO" Password="shalom99">
<Schedule>
<StartAt>0001-01-01T09:30:00</StartAt>
<EndAt>0001-01-01T16:00:00</EndAt>
</Schedule>
</Session>
</Accounts>
2 ответа
Поскольку вы определили классы, вы должны просто иметь возможность использовать атрибуты XML-сериализации и использовать десериализатор XML по умолчанию.
Ваша структура не выглядит слишком сложной, есть ли какая-то особая причина, по которой вы не используете атрибуты сериализации вместо десериализации вручную?
Повторно унаследованные поля... если вы переключитесь на DataContractSerializer
, тогда поля "opt in" вместо "opt out" - но вы теряете возможность указывать атрибуты (все является элементом). Тривиальный пример:
[DataContract(Name="foo")]
public class Foo
{
[DataMember(Name="bar")]
public string Bar { get; set; }
public int ThisIsntSerialized {get;set;}
}
Однако добавление неожиданных подклассов является болью для обоих XmlSerializer
а также DataContractSerializer
, Оба могут сделать это, но это не красиво...