我正在尝试XML序列化包含枚举属性的类。如果使用特定的枚举声明属性,它就可以正常工作。但我需要属性为Enum类型,所以我可以将它设置为不同的枚举类型。但是,这样做时我会遇到异常。
类型[namespace] .Simple可能不会在此上下文中使用。
我在枚举定义上尝试了不同的属性,但到目前为止还没有完成。有没有办法做到这一点?
Private Sub ResetControl(ByVal sender As Object, ByVal e As EventArgs)
Dim _UserControl As UserControl1 = CType(Me.Control, UserControl1)
Dim _PropertyDescriptor As PropertyDescriptor = TypeDescriptor.GetProperties(_UserControl)("BackColor")
_PropertyDescriptor.ResetValue(_UserControl)
End Sub
答案 0 :(得分:1)
Enum
是抽象的,无法序列化。可能的解决方法见this answer。
enum
的通用基本类型是int
(默认情况下,也可以是字节或长整数)。
所以你也可以简单地使用这个整数基类型,比如byte Simple
类中的Foo
。
如果您需要字符串表示形式出现在xml中(与枚举字段名称相同),请将其公开为string Simple
。
答案 1 :(得分:1)
您可以尝试在DataContract上设置要序列化的EnumMember attrubute,以获取更具体的信息访问 https://msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute(v=vs.110).aspx
答案 2 :(得分:0)
基于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();
}
}