public void ShouldSerializeAbstractClassReference() { // Given KnownTypesContainer knownTypes = new KnownTypesContainer().Add <Milk>("milk").Add <Bread>("bread").Add <Employee>("employee"); var milk = new Milk { Caption = "Первый вкус", Protein = 2.9f }; var bread = new Bread { Caption = "Бородинский", Richness = 365 }; var item1 = new OrderItem { Product = milk, Count = 1, Price = 45.5f }; var item2 = new OrderItem { Product = bread, Count = 1, Price = 20.3f }; var client = new Employee { FirstName = "Вася", JobTitle = "Аналитик" }; var target = new Order { Client = client, Items = new[] { item1, item2 } }; // When Order result = SerializeAndDeserialize(target, knownTypes); // Then Assert.IsNotNull(result); Assert.IsInstanceOf <Employee>(result.Client); Assert.AreEqual(client.FirstName, result.Client.FirstName); Assert.AreEqual(client.JobTitle, ((Employee)result.Client).JobTitle); Assert.IsNotNull(result.Items); Assert.AreEqual(2, result.Items.Count()); Assert.IsInstanceOf <Milk>(result.Items.ElementAt(0).Product); Assert.AreEqual(milk.Caption, ((Milk)result.Items.ElementAt(0).Product).Caption); Assert.AreEqual(milk.Protein, ((Milk)result.Items.ElementAt(0).Product).Protein); Assert.AreEqual(item1.Count, result.Items.ElementAt(0).Count); Assert.AreEqual(item1.Price, result.Items.ElementAt(0).Price); Assert.IsInstanceOf <Bread>(result.Items.ElementAt(1).Product); Assert.AreEqual(bread.Caption, ((Bread)result.Items.ElementAt(1).Product).Caption); Assert.AreEqual(bread.Richness, ((Bread)result.Items.ElementAt(1).Product).Richness); Assert.AreEqual(item2.Count, result.Items.ElementAt(1).Count); Assert.AreEqual(item2.Price, result.Items.ElementAt(1).Price); }