使用[XmlAnyElement将] [英] Using [XmlAnyElement]

查看:481
本文介绍了使用[XmlAnyElement将]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图保持在两个不同的版本,一个对象的数据,并没有任何与它的成功。 ?谁能告诉我什么,我做错了。



之类的版本一:

  [DataContract(名称=人)] 
公共类Person_V1
{
[数据成员(名称=名称)]
公共字符串名称;

[数据成员(NAME =时代)]
公众诠释年龄;

[XmlAnyElement将]
公众的XmlElement [] XElements;
}



的类版本二:

  [DataContract(名称=人)] 
公共类Person_V2
{
[数据成员(名称=名称)]
公共字符串名称;

[数据成员(NAME =时代)]
公众诠释年龄;

[数据成员(名称为重量)]
公众诠释重量;

[XmlAnyElement将]
公众的XmlElement [] XElements;
}



对象的储蓄V2:

 私人无效btnSave_V2_Click(对象发件人,EventArgs五)
{
Person_V2 p =新Person_V2(){名称=嘉莉,年龄= 31,重量= 125};

变种DS =新的DataContractSerializer(typeof运算(Person_V2));

XmlWriterSettings设置=新XmlWriterSettings(){缩进= TRUE};

使用(XmlWriter的W = XmlWriter.Create(person.xml设置))
ds.WriteObject(W,P);
}



还原对象的V2到V1对象。希望看到权重变量信息保存在XElements数组中,但它不会发生。



 私人无效btnRestore_V1_Click(对象发件人,EventArgs E)
{
Person_V1磷;

变种DS =新的DataContractSerializer(typeof运算(Person_V1));

XmlReaderSettings设置=新XmlReaderSettings();

使用(XmlReader中R = XmlReader.Create(person.xml设置))
P =(Person_V1)ds.ReadObject(R);

MessageBox.Show(p.Name ++ p.Age);
}


解决方案

XML *属性类由的XmlSerializer ,而不是由的DataContractSerializer 。据我所知,的DataContractSerializer 并没有任何机制来处理这种情况。如果可以,用的XmlSerializer 相反,它是灵活得多。


I'm trying to preserve data on two different versions of an object and not having any success with it. Can anyone tell me what I'm doing wrong?

Version One of the class:

 [DataContract (Name="Person")]
 public class Person_V1
 {
     [DataMember(Name = "Name")]
     public string Name;

     [DataMember(Name = "Age")]
     public int Age;

     [XmlAnyElement]
     public XmlElement[] XElements;
}

Version Two of the class:

[DataContract(Name = "Person")]
public class Person_V2
{
    [DataMember(Name = "Name")]
    public string Name;

    [DataMember(Name = "Age")]
    public int Age;

    [DataMember(Name = "Weight")]
    public int Weight;

    [XmlAnyElement]
    public XmlElement[] XElements;
}

Saving V2 of object:

private void btnSave_V2_Click(object sender, EventArgs e)
{
    Person_V2 p = new Person_V2() { Name = "Carrie", Age = 31, Weight = 125 };

    var ds = new DataContractSerializer(typeof(Person_V2));

    XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };

    using (XmlWriter w = XmlWriter.Create("person.xml", settings))
        ds.WriteObject(w, p);
}

Restoring V2 of object into V1 object. Would expect to see Weight variable info saved in the XElements array but it doesn't happen

private void btnRestore_V1_Click(object sender, EventArgs e)
{
    Person_V1 p;

    var ds = new DataContractSerializer(typeof(Person_V1));

    XmlReaderSettings settings = new XmlReaderSettings();

    using (XmlReader r = XmlReader.Create("person.xml", settings))
        p = (Person_V1)ds.ReadObject(r);

    MessageBox.Show(p.Name + " " + p.Age);
}

解决方案

The Xml*Attribute classes are used by XmlSerializer, not by DataContractSerializer. As far as I know, DataContractSerializer doesn't have any mechanism to handle this scenario. If you can, use XmlSerializer instead, it's much more flexible.

这篇关于使用[XmlAnyElement将]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆