【问题标题】:C# DataContractSerializer SerializationException with Enum set in object fieldC# DataContractSerializer SerializationException,在对象字段中设置了枚举
【发布时间】:2011-07-31 10:43:15
【问题描述】:

给定以下代码,

[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设置为Enum值时序列化失败?

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.

【问题讨论】:

  • 您想通过使用object type 来解决_TestVariable 的问题,也许您可​​以解释真正的问题。
  • 查看类似问题的答案stackoverflow.com/a/8795410/52277

标签: c# exception enums datacontractserializer


【解决方案1】:

您应该在 TestClass 上使用 KnownTypeAttribute

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

【讨论】:

  • 宾果游戏!这使它可以编译,但是很痛苦。枚举不是要序列化的简单类型吗?
  • 这与枚举无关。那是关于使用类型对象的变量而不是精确类型。在这种情况下,序列化程序不知道在序列化和反序列化过程中会遇到什么类型,所以你应该通过这个属性让它知道。如果您使用精确的数据类型而不是对象,则不需要
【解决方案2】:

另一个避免将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
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多