[英]XML serializing Enum type properties
我正在嘗試對包含枚舉屬性的類進行XML序列化。 如果使用特定的枚舉來聲明該屬性,則可以正常工作。 但是我需要將該屬性設置為Enum類型,因此可以將其設置為不同的枚舉類型。 但是,這樣做時會出現異常。
在此上下文中,不能使用類型[namespace] .Simple。
我在枚舉定義中嘗試了不同的屬性,但到目前為止還沒有正確。 有沒有辦法做到這一點?
public enum Simple : byte
{
one = 0x01,
two = 0x02,
three = 0x03
}
public class Foo
{
public Enum Simple { get; set; }
}
public class Program
{
static void Main(string[] args)
{
using (var writer = XmlWriter.Create(Console.OpenStandardOutput()))
{
try
{
var foo = new Foo
{
Simple = Simple.three
};
var serializer = new XmlSerializer(foo.GetType());
serializer.Serialize(writer, foo);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Console.ReadLine();
}
}
Enum
是抽象的,無法序列化。 這個答案提出了一種可能的解決方法。
enum
的通用基本類型為int
(默認情況下,例如也可以是字節或長int
)。
因此,您也可以簡單地使用此整數基類型,例如Foo
類中的byte Simple
。
如果您需要將字符串表示形式顯示在xml中(與枚舉字段名稱相同),請將其表示為string Simple
。
您可以嘗試在要序列化的DataContract上設置EnumMember屬性,有關更多特定信息,請訪問https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.enummemberattribute(v=vs.110 ).aspx
基於dlatikay的關於將枚舉分為兩個用於枚舉類型和成員名稱的字符串的想法,我提出了以下解決方案。 該示例將從Foo
對象轉換為XML字符串,然后再次轉換為新的Foo
對象。
public enum SimpleEnum : byte
{
one = 0x01,
two = 0x02,
three = 0x03
}
public class Foo
{
private Enum _simple;
[XmlIgnore]
public Enum Simple
{
get { return _simple; }
set {
_simple = value;
var type = Simple.GetType();
var underlyingType = Enum.GetUnderlyingType(type);
EnumType = Simple.GetType().FullName;
EnumMember = Simple.ToString();
}
}
private string _enumType;
public string EnumType
{
get { return _enumType; }
set { _enumType = value; }
}
private string _enumMember;
public string EnumMember
{
get { return _enumMember; }
set {
_enumMember = value;
_simple = (Enum)Enum.Parse(Type.GetType(EnumType), EnumMember);
}
}
}
public class Program
{
static void Main(string[] args)
{
var str = new StringBuilder();
using (var writer = XmlWriter.Create(str))
{
try
{
var foo = new Foo
{
Simple = SimpleEnum.three
};
var serializer = new XmlSerializer(typeof(Foo));
serializer.Serialize(writer, foo);
Console.WriteLine(str.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
using (TextReader reader = new StringReader(str.ToString()))
{
try
{
var serializer = new XmlSerializer(typeof(Foo));
var foo = (Foo)serializer.Deserialize(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Console.ReadLine();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.