【问题标题】:IXmlSerializableIXmlSerializable
【发布时间】:2009-06-27 03:59:16
【问题描述】:

你们能帮我解决通过 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>

【问题讨论】:

    标签: c# xml ixmlserializable


    【解决方案1】:

    由于您已经定义了类,您应该能够使用 XML 序列化属性,并使用默认的 XML 反序列化器。

    您的结构看起来并不过分复杂,是否有什么特殊原因您不使用序列化属性而不是手动反序列化?

    【讨论】:

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

    重新继承的字段...如果您切换到DataContractSerializer,那么字段是“选择加入”而不是“选择退出” - 但您失去了指定属性的能力(一切都是元素)。一个简单的例子:

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

    但是 - 添加意外的子类对于 XmlSerializerDataContractSerializer 来说都是一种痛苦。两者都可以,但它并不漂亮......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多