2013-04-02 43 views
1

我想序列化类层次结构,并在结果xml中保留层次结构树。我使用实现Message抽象类的Heartbeat对象设置ProtokolMessage类的消息属性 。由于输出结果,我想下面的XML:保持层次结构树的序列化类

<protocol> 
    <name>someName</name> 
    <messageId>1101</messageId> 
    <heartbeat> 
      <time>2013-04-02T17:35:55</time> 
    </heartbeat> 
</protocol> 

但是生成的XML是:

<protocol> 
    <Message xsi:type="heartbeat" /> 
    <name>someName</name> 
    <messageID xmlns="Message">1101</messageID> 
</protocol> 

领域模型:

[XmlRoot("protocol")] 
public class ProtocolMessage 
{ 
    [XmlElement(ElementName = "name")] 
    public string Name { get; set; } 

    [XmlElement(ElementName = "messageID")] 
    public string MessageID { get; set; } 

    public Message Message {get; set;} 

    public ProtocolMessage() 
    {} 
} 

[XmlInclude(typeof(Heartbeat))] 
public abstract class Message 
{ 
    public Message() 
    { } 
} 

[XmlType(TypeName = "heartbeat")] 
public class Heartbeat : Message 
{ 
    [XmlElement("time")] 
    protected string Time { get; set; } 

    public Heartbeat() 
     : this(DateTime.Now) 
    { 
    } 

    public Heartbeat(DateTime dateTime) 
    { 
     Time = dateTime.ToString("s"); 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var protocolMsg = new ProtocolMessage 
     { 
      Name = "someName", 
      MessageId = "1101", 
      Message = new Heartbeat(); 
     }; 

     var serializer = new XmlSerializer(typeof(ProtocolMessage)); 
     StringWriter sw = new StringWriter(); 
     serializer.Serialize(sw, this); 
    } 
} 

我能层次树的XML?

回答

1

时间没有显示,因为它是受保护的属性。

如果您将其更改为公开,您会正确看到该元素。

<?xml version="1.0" encoding="utf-16"?> 
<protocol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <name>someName</name> 
    <messageID>1101</messageID> 
    <Message xsi:type="Heartbeat"> 
    <time>2013-04-02T15:09:36</time> 
    </Message> 
</protocol> 

,如果你设置的ElementName到上述消息的“心跳”,将工作,但我认为这可能不是为你工作,如果你有不同的类型,他们将始终设置为“心跳”的消息。

[XmlElement(ElementName = "heartbeat")] 
public Message Message { get; set; } 
+0

很酷,投票。我可以获得而不是吗? – Maxim

+0

我一直无法让它看起来那样,所以我不太确定。 –

+0

我能够得到它的工作,但我不知道它是否会帮助你。见上面的编辑。 –