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