使用继承创建Xml文档

3

我希望有一个基类来实现这个例子的大部分内容,并在不同的地方继承。所有的信息都是一样的,只有消息节点可能会非常不同。有人知道怎么做吗?

[XmlRoot("Package")]
public class Package
{
    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }

        //etc...
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        // here I want different message types
        // hopefully through inheritance
    }
}

例如,有时我需要这样做...
<Package>
    <Parameters>
        <MessageType></MessageType>
        <CreationDateTime></CreationDateTime>
        <MessageId></MessageId>
    </Parameters>
    <Message>
        <MessageTypeRequest>
            <etc1></etc1>
            <etc2></etc2>
        </MessageTypeRequest>
    </Message>
</Package>

...但我希望在其他时间得到这个。

<Package>
    <Parameters>
        <MessageType></MessageType>
        <CreationDateTime></CreationDateTime>
        <MessageId></MessageId>
    </Parameters>
    <Message>
        <MessageTypeResponse>
            <etc1></etc1>
            <etc2></etc2>
        </MessageTypeResponse>
    </Message>
</Package>
3个回答

1
如果你有一个类:

public class Message { }

那么你可以通过继承它来创建新的消息类型(当然你已经知道这一点):
public class Request : Message { ... }  
public class Response : Message { ... }

现在,如果您想将这些类的实例分配给您的属性Package.Message,并希望它们被正确序列化,您必须通过属性包含这些继承类型:
[XmlInclude(typeof(Request))]
[XmlInclude(typeof(Response))]
public class Package { ... }

生成的Xml看起来可能有些不同, 但含义是一样的。
<Message d3p1:type="Request" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance">
...
</Message>

1
谢谢Botz3000您的回复,您的提示很有帮助。
我选择了这个方法,它能产生精确的结果。虽然我更希望基类不需要知道使用它的类。以下是代码示例:
[XmlRoot("Package")]
public class Package
{
    public Package() { }
    public Package(MessageTypeRequest req)
    {
        Message = new message();
        Message.requestMessage = req;
    }
    public Package(MessageTypeResponse resp)
    {
        Message = new message();
        Message.responseMessage = resp;
    }

    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        [XmlElement("MessageTypeRequest")]
        public MessageTypeRequest requestMessage { get; set; }

        [XmlElement("MessageTypeResponse")]
        public MessageTypeResponse responseMessage { get; set; }
    }
}

public class MessageTypeRequest : Package
{
    public MessageTypeRequest()
    {
        etc1 = "A simple request.";
        etc2 = "test 2";
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

public class MessageTypeResponse : Package
{
    public MessageTypeResponse()
    {
        etc1 = "My simple response";
        etc2 = "test 2";
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

0
事实证明,在我的消息类中添加更多属性后,序列化开始不正确地序列化xml文件,包括在派生类中的基类项目...这就是解决问题的方法:
[XmlRoot("Package")]
public class Package
{
    public Package() { }
    public Package(MessageContent messageContent)
    {
        Message = new message();
        Message.messageContent = messageContent;
    }

    [XmlElement("Parameters")]
    public parameters Parameters;
    public class parameters
    {
        [XmlElement("MessageType")]
        public string MessageType { get; set; }

        [XmlElement("CreationDateTime")]
        public string CreationDateTime { get; set; }
    }

    [XmlElement("Message")]
    public message Message;
    public class message
    {
        [XmlElement(Type = typeof(MessageTypeRequest)), XmlElement(Type = typeof(MessageTypeResponse))]
        public MessageContent messageContent { get; set; }
    }
}

public class MessageContent { }

public class MessageTypeRequest : MessageContent
{
    public MessageTypeRequest()
    {
        etc1 = "A simple request.";
        etc2 = "test 2";
    }

    public static Package MessageRequest()
    {
        return new Package(new MessageTypeRequest());
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

public class MessageTypeResponse : MessageContent
{
    public MessageTypeResponse()
    {
        etc1 = "My simple response";
        etc2 = "test 2";
    }

    public static Package MessageRequest()
    {
        return new Package(new MessageTypeResponse());
    }

    [XmlElement("etc1")]
    public string etc1 { get; set; }

    [XmlElement("etc2")]
    public string etc2 { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接