我想使用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方法会更好。
如果有人知道一个简单的方法,我真的很感激帮助。
答案 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应该是最简单的解决方案。