using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
[KnownType(typeof(Sale))]
[KnownType(typeof(Restaurant))]
public class ObjectDictionary : Dictionary<string, object>
static void Main(string[] args)
var dict = new ObjectDictionary()
{"sale",new Sale(9,5243) },
{"restaurant",new Restaurant("Cheese Cake Factory", "New York")},
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(ObjectDictionary));
var json = DataContractJsonSerializerHelper.ToContractJson(dict, js);
var result = DataContractJsonSerializerHelper.FromContractJson<ObjectDictionary>(json, js);
Console.WriteLine("Original {0}:", dict);
Console.WriteLine("Deserialized result {0}:", result);
Assert.IsTrue(dict.Values.Select(v => v.GetType()).SequenceEqual(result.Values.Select(v => v.GetType())));
[DataMember(Name = "SaleId")]
public int SaleId {get; set;}
[DataMember(Name = "Total")]
public int Total{ get; set;}
public Sale(int saleid, int total)
[DataContract(Name = "Restaurant", Namespace="")]
[DataMember(EmitDefaultValue = false)]
public string Name {get; set;}
[DataMember(EmitDefaultValue = false)]
public string City{get; set;}
public Restaurant(string name, string city)
public static partial class DataContractJsonSerializerHelper
private static MemoryStream GenerateStreamFromString(string value)
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
public static string ToContractJson<T>(this T obj, DataContractJsonSerializer serializer)
serializer = serializer ?? new DataContractJsonSerializer(obj == null ? typeof(T) : obj.GetType());
using (var memory = new MemoryStream())
serializer.WriteObject(memory, obj);
memory.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(memory))
return reader.ReadToEnd();
public static T FromContractJson<T>(string json, DataContractJsonSerializer serializer)
serializer = serializer ?? new DataContractJsonSerializer(typeof(T));
using (var stream = GenerateStreamFromString(json))
var obj = serializer.ReadObject(stream);