使用继承来创建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; }
}