如何使用C#序列化序列化为非常自定义的格式

时间:2014-06-02 21:17:51

标签: c# xml serialization

我想使用C#的内置序列化功能来序列化以下类:

public class DevicePolicy
{
    public enum SharingLevel
    {
        Unrestricted,
        Blocked
    }

    public SharingLevel SHARING_LEVEL = SharingLevel.Blocked;
    public bool REQUIRES_AUTHENTICATION = false;
    public List<string> MANAGED_LIST = new List<string>();
}

对此:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
  <string name="SHARING_LEVEL">BLOCKED</string>
  <boolean name="REQUIRES_AUTHENTICATION" value="false" />
  <set name="MANAGED_LIST">
    <string>blah</string>
  </set>
</map>

注意:我不控制Xml的样子,因为它被其他我无法改变的东西所消耗。所以我必须完全匹配。

我很难做到这一点,我开始怀疑,如果尝试使C#的内置序列化工作使用这样的自定义格式,那么编写自己的SerializeXml和DeserializeXml方法会更好。

如果有人知道一个简单的方法,我真的很感激帮助。

2 个答案:

答案 0 :(得分:1)

当您需要自定义内容时,您可能需要咬紧牙关并让您的类实现IXmlSerializable来执行自定义序列化。这是一个序列化SharingLevel对象的示例,剩下的就是让你去做。

public class DevicePolicy : IXmlSerializable
{
    public enum SharingLevel
    {
        Unrestricted,
        Blocked
    }

    public SharingLevel SHARING_LEVEL = SharingLevel.Blocked;
    public bool REQUIRES_AUTHENTICATION = false;
    public List<string> MANAGED_LIST = new List<string>();

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        throw new NotImplementedException(); //TODO
    }

    public void WriteXml(XmlWriter writer)
    {
        //Root
        writer.WriteStartElement("map");

        //The element for "SharingLevel SHARING_LEVEL"
        writer.WriteStartElement("string");
        writer.WriteAttributeString("name", "SHARING_LEVEL");
        writer.WriteString(SHARING_LEVEL.ToString().ToUpperInvariant());
        writer.WriteEndElement();

        //The element for "bool REQUIRES_AUTHENTICATION"
        writer.WriteStartElement("boolean");
        throw new NotImplementedException(); //TODO
    }
}

答案 1 :(得分:0)

您可以通过DataContractAttribute或使用LINQ to XML来完成。只是谷歌这个方向。 我认为LINQ to XML应该是最简单的解决方案。