C# IXmlSerializable
你们能帮我一下吗?我对通过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;
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中不显示这些值对我来说似乎很奇怪。