C# 在XmlSerializer上修饰Xml类名

C# 在XmlSerializer上修饰Xml类名,c#,attributes,computer-science,xmlserializer,C#,Attributes,Computer Science,Xmlserializer,我需要获取以下xml: <request id="1"> <login> <username>username</username> <password>password</password> </login> </request> <request id="1"> <Content> <username>username<

我需要获取以下xml:

<request id="1">
  <login>
    <username>username</username>
    <password>password</password>
  </login>
</request>
<request id="1">
  <Content>
    <username>username</username>
    <password>password</password>
  </Content>
</request>

用户名
密码
但是中间的xml可以更改为另一种请求类型,如

<request id="1">
  <logout />
</request>

我尝试了以下方法:

[XmlRootAttribute(ElementName = "request", Namespace = "", IsNullable = false)]
public class Request<T>
{
    [XmlAttributeAttribute(AttributeName = "id", Namespace = "")]
    public string Id { get; set; }

    public T Content { get; set; }
}

[XmlTypeAttribute(TypeName = "login", AnonymousType = true)]
public class LoginRequest
{
    [XmlElementAttribute(ElementName = "username", Namespace = "")]
    public string Username;

    [XmlElementAttribute(ElementName = "password", Namespace = "")]
    public string Password;
}

[XmlTypeAttribute(TypeName = "logout", AnonymousType = true)]
public class LogoutRequest
{
}
[XmlRootAttribute(ElementName=“request”,Namespace=”“,IsNullable=false)]
公共类请求
{
[XmlAttributeAttribute(AttributeName=“id”,Namespace=”“)]
公共字符串Id{get;set;}
公共T内容{get;set;}
}
[XmlTypeAttribute(TypeName=“login”,AnonymousType=true)]
公共类登录请求
{
[XmlElementAttribute(ElementName=“username”,Namespace=”“)]
公共字符串用户名;
[XmlElementAttribute(ElementName=“password”,Namespace=”“)]
公共字符串密码;
}
[XmlTypeAttribute(TypeName=“logout”,AnonymousType=true)]
公共类LogoutRequest
{
}
但是当我使用

var serializer = new XmlSerializer(typeof(Request<LoginRequest>));
var serializer=newxmlserializer(typeof(Request));
我得到了以下xml:

<request id="1">
  <login>
    <username>username</username>
    <password>password</password>
  </login>
</request>
<request id="1">
  <Content>
    <username>username</username>
    <password>password</password>
  </Content>
</request>

用户名
密码
如何将标记内容重命名为登录或注销


非常感谢

假设您知道所有可能的请求类型,您可以使用构造函数覆盖特定类型的属性名称:

[XmlRoot(ElementName = "request", Namespace = "", IsNullable = false)]
public class Request
{
    [XmlAttributeAttribute(AttributeName = "id", Namespace = "")]
    public string Id { get; set; }

    [XmlElement("login", Type = typeof(LoginRequestData))]
    [XmlElement("logout", Type = typeof(LogoutRequestData))]
    public BaseRequestData RequestData { get; set; }

    public TRequestData GetRequestData<TRequestData>() where TRequestData : BaseRequestData
    {
        return RequestData as TRequestData;
    }
}

public abstract class BaseRequestData
{
}

public class LoginRequestData : BaseRequestData
{
    [XmlElementAttribute(ElementName = "username", Namespace = "")]
    public string Username;

    [XmlElementAttribute(ElementName = "password", Namespace = "")]
    public string Password;
}

public class LogoutRequestData : BaseRequestData
{
}

public class SomeUnknownRequestData : BaseRequestData
{
}
xml1
看起来像:

<?xml version="1.0" encoding="utf-16"?>
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <login>
        <username>foo</username>
        <password>bar</password>
    </login>
</request>
<?xml version="1.0" encoding="utf-16"?>
<request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <logout />
</request>
这是你想要的吗?我消除了简单性要求的一般性