鉴于以下代码,
[DataContract]
public class TestClass
{
[DataMember]
public object _TestVariable;
public TestClass(object value)
{
_TestVariable = value;
}
public void Save()
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(new FileStream("test.tmp", FileMode.Create)))
{
DataContractSerializer ser = new DataContractSerializer(typeof(TestClass));
ser.WriteObject(writer, this);
}
}
}
public enum MyEnum
{
One,
Two,
Three
}
为什么在_TestVariable
设置为枚举值时无法序列化?
new TestClass(1).Save(); // Works
new TestClass("asdfqwer").Save(); // Works
new TestClass(DateTime.UtcNow).Save(); // Works
new TestClass(MyEnum.One).Save(); // Fails
抛出的异常是:
System.Runtime.Serialization.SerializationException : Type 'xxx.MyEnum' with data contract name 'xxx.MyEnum:http://schemas.datacontract.org/2004/07/Tests' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
答案 0 :(得分:5)
您应该在TestClass上使用KnownTypeAttribute。
[DataContract]
[KnownTypeAttribute(typeof(MyEnum))]
public class TestClass
答案 1 :(得分:4)
您可以使用的另一个选项是避免必须将KnownType属性放在所有位置,而是使用类型推导为您完成工作。
class Program
{
static void Main(string[] args)
{
TestClass.Create(1).Save(); // Works
TestClass.Create("asdfqwer").Save(); // Works
TestClass.Create(DateTime.UtcNow).Save(); // Works
TestClass.Create(MyEnum.One).Save(); // Fails
}
}
public class TestClass
{
public static TestClass<T> Create<T>(T value)
{
return new TestClass<T>(value);
}
}
[DataContract]
public class TestClass<T>
{
[DataMember]
public T _TestVariable;
public TestClass(T value)
{
_TestVariable = value;
}
public void Save()
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(new MemoryStream()))
{
DataContractSerializer ser = new DataContractSerializer(typeof(TestClass<T>));
ser.WriteObject(writer, this);
}
}
}
public enum MyEnum
{
One,
Two,
Three
}
答案 2 :(得分:0)
MyEnum未标记为可序列化。将DataContractAttribute添加到MyEnum应该修复它。