我有以下示例 C# 代码,它是使用 svcutil.exe 应用程序从 xsd 自动生成的。
[DataContract]
public enum Foo
{
[EnumMember(Value = "bar")]
Bar = 1,
[EnumMember(Value = "baz")]
Baz = 2
}
[DataContract]
public class UNameIt
{
[DataMember(Name = "id")]
public long Id { get; private set; }
[DataMember(Name = "name")]
public string Name { get; private set; }
[DataMember(Name = "foo")]
public Foo Foo { get; private set; }
}
以下是一个单元测试,尝试将示例 JSON 文档反序列化为 U Name It 类。
[TestClass]
public class JsonSerializer_Fixture
{
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""Bar""}";
[TestMethod]
public void DataObjectSimpleParseTest()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UNameIt));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(JsonData));
UNameIt dataObject = serializer.ReadObject(ms) as UNameIt;
Assert.IsNotNull(dataObject);
Assert.AreEqual(123456, dataObject.Id);
Assert.AreEqual(Foo.Baz, dataObject.Foo);
}
}
不幸的是,测试失败了,原因如下:
System.Runtime.Serialization.SerializationException:有一个
反序列化 MyNamespace.Units.UNameIt 类型的对象时出错。这
值“Bar”无法解析为类型“Int64”。
如果我更新 JSON 字符串以将 Enum 的字符串说明符替换为整数,则测试将通过,例如
public const string JsonData = @"{ ""id"":123456,
""name"":""John Doe"",
""foo"":""1""}";
我没有灵活性来更改提供的 JSON,因此我必须弄清楚如何在序列化时转换字符串枚举表示。理想情况下,我希望在不必更改我的自动生成类的情况下促进这一点,因为一旦我重新生成该类,我就会丢失我的更改。
我想知道是否可以将 DataContractJsonSerializer 扩展到自定义句柄枚举?或者也许有更好的方法来做到这一点?