使用继承来创建Xml文档

问题描述:

我想要一个基类来实现这个例子的大部分,并且继承不同的部分。除了消息节点之外,所有消息都是相同的,这可能会非常不同。有人知道怎么做吗?使用继承来创建Xml文档

[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> 

如果你有一个类

public class Message { }

那么你可以从他们那里继承创建新的消息类型(当然你知道的那部分):

public class Request : Message { ... } 
public class Response : Message { ... } 

现在,如果您希望能够将这些类的实例分配给您的属性Package.Message并希望它们正确地序列化,您必须通过一个包含这些继承的类型ttributes:

[XmlInclude(typeof(Request))] 
[XmlInclude(typeof(Response))] 
public class Package { ... } 

生成的XML看起来有些不同,但具有相同的含义:

<Message d3p1:type="Request" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance"> 
... 
</Message> 

谢谢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; } 
} 

事实证明,增加更多的属性,以我的消息类之后,序列化开始连载的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; } 
}