¿Cómo puedo hacer que DataContractJsonSerializer serialice un objeto como una cadena?

Tengo una estructura en C # que envuelve un guid. Estoy usando DataContractJsonSerializer para serializar un objeto que contiene una instancia de esa clase. Cuando estaba usando un guid directamente, se serializó como una cadena simple, pero ahora se serializa como un par de nombre / valor. Aquí hay una prueba NUnit y un código de soporte que demuestra el problema:

private static string ToJson(T data) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof (T)); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, data); return Encoding.Default.GetString(ms.ToArray()); } } [Serializable] private class ID { private Guid _value; public static explicit operator ID(Guid id) { return new ID { _value = id }; } public static explicit operator Guid(ID id) { return id._value; } } [Test] public void IDShouldSerializeLikeGuid() { Guid guid = Guid.NewGuid(); ID id = (ID) guid; Assert.That(ToJson(id), Is.EqualTo(ToJson(guid))); } 

Y la salida del corredor de prueba:

 NUnit.Framework.AssertionException: Expected string length 38 but was 49. Strings differ at index 0. Expected: ""7511fb9f-3515-4e95-9a04-06580753527d"" But was: "{"_value":"7511fb9f-3515-4e95-9a04-06580753527d"}" -----------^ 

¿Cómo serializo mi estructura como una cadena simple y hago que mi prueba pase?

En este caso, parece que realmente no quieres JSON, quieres una representación de cadena. En ese caso yo crearía una interfaz como esta:

 interface IStringSerialized { String GetString(); } 

Implemente esta interfaz en su tipo de ID (y en todos los demás tipos que tengan requisitos similares).

 [Serializable] class ID : IStringSerialized { private Guid _value; public static explicit operator ID(Guid id) { return new ID { _value = id }; } public static explicit operator Guid(ID id) { return id._value; } public string GetString() { return this._value.ToString(); } } 

Luego modifique su método de serialización para manejar estos casos especiales:

 private static string ToJson(T data) { IStringSerialized s = data as IStringSerialized; if (s != null) return s.GetString(); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, data); return Encoding.Default.GetString(ms.ToArray()); } } 

Intente usar la clase JavaScriptSerializer para evitar el problema de la clave, la expansión de valores.