对象字段中设置了枚举的C#DataContractSerializer序列化异常

对象字段中设置了枚举的C#DataContractSerializer序列化异常,c#,exception,enums,datacontractserializer,C#,Exception,Enums,Datacontractserializer,给定以下代码 [DataContract] public class TestClass { [DataMember] public object _TestVariable; public TestClass(object value) { _TestVariable = value; } public void Save() { using (XmlDictionaryWriter writer = XmlDictionaryWriter.Cr

给定以下代码

[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
}
\u 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.

MyEnum未标记为可序列化。将DataContractAttribute添加到MyEnum应该可以修复它。

您应该在TestClass上使用

[DataContract]
[KnownTypeAttribute(typeof(MyEnum))]
public class TestClass

另一种避免将属性放得到处都是的方法是使用类型推断为您完成工作

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
}
类程序
{
静态void Main(字符串[]参数)
{
TestClass.Create(1.Save();//有效
TestClass.Create(“asdfqwer”).Save();//有效
TestClass.Create(DateTime.UtcNow.Save();//有效
TestClass.Create(MyEnum.One).Save();//失败
}
}
公共类TestClass
{
公共静态TestClass创建(T值)
{
返回新的TestClass(值);
}
}
[数据合同]
公共类TestClass
{
[数据成员]
公共T_测试变量;
公共测试类(T值)
{
_TestVariable=值;
}
公共作废保存()
{
使用(XmlDictionaryWriter writer=XmlDictionaryWriter.CreateTextWriter(new MemoryStream()))
{
DataContractSerializer ser=新的DataContractSerializer(typeof(TestClass));
ser.WriteObject(writer,this);
}
}
}
公共枚举髓鞘
{
一,,
二,,
三
}

for\u TestVariable使用
object type
for\u TestVariable你想解决什么问题,也许你可以解释真正的问题。看看类似问题的答案,宾果!这使得它可以编译,但这是一件痛苦的事情。枚举不是要序列化的简单类型吗?这与枚举无关。这是关于使用object类型的变量而不是确切类型的变量。在这种情况下,序列化程序不知道在序列化和反序列化期间将遇到什么类型,所以您应该通过此属性让它知道。如果您使用的是精确的数据类型而不是对象,那么就不需要这个