C# DataContractSerializer SerializationException with Enum set in object field

…衆ロ難τιáo~ 提交于 2019-12-08 06:25:12

问题


Given the following code,

[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
}

Why does it fail to serialize when _TestVariable is set to an Enum value?

new TestClass(1).Save(); // Works
new TestClass("asdfqwer").Save(); // Works
new TestClass(DateTime.UtcNow).Save(); // Works
new TestClass(MyEnum.One).Save(); // Fails

The exception thrown is:

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.

回答1:


You should use KnownTypeAttribute on TestClass.

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



回答2:


Another option that you could employ to avoid having to put the KnownType attribute all over the place is to use type deduction to do the work for you.

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
}



回答3:


MyEnum is not marked as serializable. Adding DataContractAttribute to MyEnum should fix it.



来源:https://stackoverflow.com/questions/5577370/c-sharp-datacontractserializer-serializationexception-with-enum-set-in-object-fi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!