C# IXmlSerializable

C# IXmlSerializable,c#,xml,ixmlserializable,C#,Xml,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;

你们能帮我一下吗?我对通过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);
        }
 }
var ArrayOfAccounts=新账户()//这是我想读的课堂结构
类别帐户:列表{}
课程表{
public DateTime StartAt{get;set;}
公共日期时间结束于{get;set;}
}
类会话:IXmlSerializable{
公共字符串名称{get;set;}
公共字符串传递{get;set;}
公共列表时间表=新列表();
public void ReadXml(System.Xml.XmlReader){
//这里有一个问题。我不知道如何在这里实现正确的代码。我已经试过了
//下面的代码,但此代码仅适用于第一个帐户,不会还原其他帐户
附表;
XmlReader subR=reader.ReadSubtree();
if(reader.MoveToAttribute(“Name”))
Name=reader.Value;
if(reader.MoveToAttribute(“密码”))
密码=reader.Value;
reader.MoveToContent();
同时(子条款如下(“附表”))
{
XmlSerializer x=新的XmlSerializer(类型(计划));
对象o=x。反序列化(subR);
如果(o)为附表,则添加((附表)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>

0001-01-01T09:30:00
0001-01-01T16:00:00

既然已经定义了类,就应该能够使用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
来说都是一件痛苦的事情。两者都可以做到,但并不完美…

我想稍后添加一些密码解密算法。我不想弄乱继承的字段。这就是为什么我决定使用IXmlSerializable…实际上我的问题在IXmlSerializable中读取嵌套字段..这也很容易做到--只有两个属性,一个被XML忽略(非解密版本),另一个被序列化版本忽略(解密版本).dint不明白…我有一个从另一个继承的类。我希望在序列化过程中忽略继承的成员。如何做到这一点?我最初的评论是为了处理密码/哈希密码的情况。至于隐藏继承的成员,我认为没有直接做到这一点的好方法。我使用了序列化代理类,但您可以最好编写自定义反序列化。但是,我要问的一个问题是,为什么要删除继承的字段?因为我可以在代码中设置值,所以(作为类的使用者)在序列化的XML中不显示这些值对我来说似乎很奇怪。