1

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>
4

2 に答える 2

1

クラスを定義したので、XMLシリアル化属性を使用でき、デフォルトのXMLデシリアライザーを使用できるはずです。

構造はそれほど複雑に見えませんが、手動で逆シリアル化する代わりにシリアル化属性を使用していない特別な理由はありますか?

于 2009-06-26T18:49:59.717 に答える
1

継承されたフィールドを再取得します...に切り替えるとDataContractSerializer、フィールドは「オプトアウト」ではなく「オプトイン」になりますが、属性を指定することはできなくなります(すべてが要素です)。ささいな例:

[DataContract(Name="foo")]
public class Foo
{
    [DataMember(Name="bar")]
    public string Bar { get; set; }

    public int ThisIsntSerialized {get;set;}
}

XmlSerializerただし、予期しないサブクラスを追加することは、との両方にとって苦痛ですDataContractSerializer。どちらもそれを行うことができますが、それはきれいではありません...

于 2009-06-26T19:59:16.520 に答える