Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化/反序列化不同的属性名称?_C#_Xml_Serialization_Deserialization - Fatal编程技术网

C# 序列化/反序列化不同的属性名称?

C# 序列化/反序列化不同的属性名称?,c#,xml,serialization,deserialization,C#,Xml,Serialization,Deserialization,我有一个旧系统,它在请求信息调用中返回xml,其名称如下: postalCodeField,firstNameField 然后,同一个系统有一个modify调用,该调用接受如下xml: PostalCode、fistName、lastName 有没有一种方法可以构建一个反序列化请求的对象,同时用不同的名称序列化xml输出 具体而言: public class RequestInfo { public string firstNameField{get;set;} public s

我有一个旧系统,它在请求信息调用中返回xml,其名称如下:

postalCodeField,firstNameField

然后,同一个系统有一个modify调用,该调用接受如下xml:

PostalCode、fistName、lastName

有没有一种方法可以构建一个反序列化请求的对象,同时用不同的名称序列化xml输出

具体而言:

public class RequestInfo
{
    public string firstNameField{get;set;}
    public string lastNameField{get;set;}
}

public class ModifyInfo
{
    public string firstName{get;set;}
    public string lastName{get;set;}
    public ModifyInfo(){}
    public ModifyInfo(RequestInfo ri)
    {
        firstName = ri.firstNameField
        .....
    }
}
有没有一种方法可以通过这些属性使它们成为同一个对象

编辑

有没有办法让一个对象在反序列化时接受一个标记名,然后在序列化时输出另一个名称

(反序列化为)myObj.MyTag(序列化为)

检查MSDN。属性需要XmlElement,根类可能需要XmlRoot

如果仅在反序列化期间需要重写属性名称,则可以使用XmlAttributeOverrides动态定义属性:

public XmlSerializer CreateOverrider()
{
    XmlElementAttribute xElement = new XmlElementAttribute();
    xElement.ElementName = "firstName"; 

    XmlAttributes xElements = new XmlAttributes();
    xElements.XmlElements.Add(xElement);

    XmlAttributeOverrides xOver = new XmlAttributeOverrides();
    xOver.Add(typeof(RequestInfo), "firstNameField", xElements);

    XmlSerializer xSer = new XmlSerializer(typeof(RequestInfo), xOver);
    return xSer;
}
查看MSDN。属性需要XmlElement,根类可能需要XmlRoot

如果仅在反序列化期间需要重写属性名称,则可以使用XmlAttributeOverrides动态定义属性:

public XmlSerializer CreateOverrider()
{
    XmlElementAttribute xElement = new XmlElementAttribute();
    xElement.ElementName = "firstName"; 

    XmlAttributes xElements = new XmlAttributes();
    xElements.XmlElements.Add(xElement);

    XmlAttributeOverrides xOver = new XmlAttributeOverrides();
    xOver.Add(typeof(RequestInfo), "firstNameField", xElements);

    XmlSerializer xSer = new XmlSerializer(typeof(RequestInfo), xOver);
    return xSer;
}

请务必注意您正在使用的实际序列化程序。每个不同的序列化程序的工作方式都不同

我假设您使用的是
System.Xml.Serialization.XmlSerializer
。如果是这种情况,那么您希望使用
System.Xml.Serialization
命名空间中的属性,例如XmlElementAttribute,如下所示:

public class Person
{
    [System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
    public string FirstName { get; set; }
}

这假定字段是XML元素。如果它是一个属性,请使用
xmldattribute
属性。

注意您正在使用的实际序列化程序很重要。每个不同的序列化程序的工作方式都不同

我假设您使用的是
System.Xml.Serialization.XmlSerializer
。如果是这种情况,那么您希望使用
System.Xml.Serialization
命名空间中的属性,例如XmlElementAttribute,如下所示:

public class Person
{
    [System.Xml.Serialization.XmlElement(ElementName = "firstNameField")]
    public string FirstName { get; set; }
}

这假定字段是XML元素。如果它是一个属性,请使用
xmldattribute
属性。

是的,我正在使用该序列化程序,并且我熟悉该属性,但是,虽然该属性允许我将标记反序列化为具有不同名称的属性,但它也将该属性序列化为列出的属性名称。因此,仅使用该属性无法解决我的问题。您可以在运行时仅在反序列化期间使用XmlAttributeOverrides添加该属性。是的,我正在使用该序列化程序,并且我熟悉该属性,但是,该属性允许我将标记反序列化为具有不同名称的属性,它还将该属性序列化为列出的属性名称。因此,仅使用该属性无法解决我的问题。您可以在运行时使用XmlAttributeOverrides在反序列化期间添加该属性。