¿Cómo personalizar la deserialización de una enumeración JSON en .NET?

Tengo el siguiente código C # de muestra que se autogenera a partir de un xsd usando la aplicación svcutils.exe.

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

a siguiente es una prueba unitaria que intenta deserializar un documento JSON de muestra para la clase UNameIt.

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

Desafortunadamente, la prueba falla dando la siguiente razón:

System.Runtime.Serialization.SerializationException: se produjo un error al deserializar el objeto de tipo MyNamespace.Units.UNameIt. El valor 'Bar' no se puede analizar como el tipo 'Int64'.

La prueba pasará si actualizo mi cadena JSON para reemplazar el especificador de cadena para la enumeración a un entero, por ejemplo,

public const string JsonData = @"{ ""id"":123456,
                                   ""name"":""John Doe"",
                                    ""foo"":""1""}";

No tengo la flexibilidad para cambiar el JSON suministrado, así que tengo que descubrir cómo convertir la representación de cadena de Enum quizás en la serialización. Idealmente, me gustaría facilitar esto sin tener que cambiar mi clase de autogeneración porque una vez que vuelva a generar la clase perdería mis cambios.

Me pregunto si sería posible extender DataContractJsonSerializer para manejar Enumeraciones personalizadas. ¿O tal vez hay una mejor manera de hacer esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta