1

我想序列化类层次结构并将层次结构树保留在生成的 xml 中。我用实现 Message 抽象类的 Heartbeat 对象设置了 ProtokolMessage 类的 Message 属性。作为输出结果,我想得到以下 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中获取层次结构树吗?

4

1 回答 1

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>

如果您在 Message 上方将 ElementName 设置为“heartbeat”,它将起作用,但我认为如果您有不同类型的 Message,它们将始终设置为“heartbeat”,这可能对您不起作用。

[XmlElement(ElementName = "heartbeat")]
public Message Message { get; set; }
于 2013-04-02T22:09:56.123 回答