Serialize object graph to XML in .Net

How to serialize any data structure to XML? My first idea was XmlSerializer. But then I found out it had some serious drawbacks. Luckily, there is a better option - NetDataContractSerializer.

In .Net, there are a few classes for (de)serialization. This is an overview of their features:


XmlSerializer

  • Cannot serialize circular references.
  • If more objects point to the same object, its copies are created in the xml for each of these references.
  • Has to know all types that could be encountered during serialization in advance - throws an exception on unknown type. Known types are passed in the constructor to XmlSerializer or marked by XmlIncludeAttribute.
  • Generates simple readable xml.

DataContractSerializer
  • Has to know types in advance - like XmlSerializer.
  • Can serialize circular references - construct with preserveObjectReferences = true
  • Used by WCF.
NetDataContractSerializer - better!
  • Serializes object graph properly including circular references.
  • Doesn't have to know types in advance.
  • However, MSDN states that it can be only used in .Net <-> .Net communication, which is ok also for storing object in a file.
  • Generates simple readable xml.
BinarryFormatter
  • Works well, like NetDataContractSerializer.
  • Disadvantage is that it serializes to binary format, which make its unusable e.g. for saving to a file that user could later edit.
  • The output is smallest thanks to the binary format.
SoapFormatter
  • Deprecated. Cannot serialize generic collections
- All serializers need the type to be serialized marked by SerializableAttribute.

kick it on DotNetKicks.com

What does it mean that XmlSerializer has to know all types that could be encountered during serialization in advance?
Imagine that we have two classes: Base and Derived.

[Serializable]

public class Base

{

public string name;

public Base()

{

name = "base instance";

}

}

[Serializable]

public class Derived : Base

{

public Derived left;

public Derived right;

public Derived()

{

}

}


What if we have a reference to Base and we actually don't want to care about the actual type?

Base b = new Derived();

// we only know we are holding reference to Base

// and we don't want to care about the actual type

XmlSerializer ser = new XmlSerializer(typeof(Base));

// serialize

using (FileStream fs = File.Create(AppDomain.CurrentDomain.BaseDirectory + "data.xml"))

{

// XmlSerializer throws an Exception

ser.Serialize(fs, b);

}

// deserialize

using (FileStream fs = File.OpenRead(AppDomain.CurrentDomain.BaseDirectory + "data.xml"))

{

Base baseDeserialized = (Base)ser.Deserialize(fs);

Derived deserialize = baseDeserialized as Derived;

}


XmlSerializer throws an exception, because it encounters an "unknown" type - Derived. We could solve this by passing all the possible derived types in constructor of XmlSerializer or tagging all by XmlIncludeAttribute. This is of course inconvenient if you have a lot of classes. The worst thing is that when you add a derived class, you have to change code elsewhere.
NetDataContractSerializer doesn't have this problem.

The second issue with XmlSerializer is that it cannot serialize complex object graph. What does it mean "to serialize object graph"?

Derived top = new Derived();

top.left = new Derived();

top.left.name = "left son";

top.right = new Derived();

top.right.name = "right son";

top.left.right = new Derived();

// top

// / \

// left right

// \ /

// bottom

top.right.left = top.left.right;

XmlSerializer ser = new XmlSerializer(typeof(Derived));

using (FileStream fs = File.Create(AppDomain.CurrentDomain.BaseDirectory + "data.xml"))

{

ser.Serialize(fs, top);

}

using (FileStream fs = File.OpenRead(AppDomain.CurrentDomain.BaseDirectory + "data.xml"))

{

Derived deserialized = (Derived)ser.Deserialize(fs);

// false - we want true

bool ok = deserialized.left.right == deserialized.right.left;

}


After deserialization,
deserialized.left.right == deserialized.right.left is false, that means the object graph is different. Worse - XmlSerializer cannot serialize circular references at all.
Again, NetDataContractSerializer doesn't have any of these problems.

kick it on DotNetKicks.com

Posted by Martin Konicek on 10:59 PM

208 comments:

«Oldest   ‹Older   201 – 208 of 208   Newer›   Newest»
Anonymous said...

Вау, нашел кучу крутых картинок с надписью я сильная!�� Это так мотивирует и поднимает настроение, когда видишь такие изображения! Если и ты хочешь почувствовать свою силу и уверенность в себе, то рекомендую заглянуть на сайт cvam.ru! Там есть ссылка https://cvam.ru/ya-silnaya, которая поможет тебе еще больше укрепить свой духовный стержень и стать настоящей сильной женщиной! Делай это, настраивайся на позитив и не забывай, что ты босс!✨

Anonymous said...

О, братцы, если вы ищете прикольные открыточки с именем Ада, то я точно знаю, куда вам отправиться! На сайте topotkritki.ru у них прямо целая подборка открыток с таким именем. И самое огонь - там есть и красивые вариации этих открыток. Адам и Ева отдыхают, говоря вам! Чтобы не заблудиться в их коллекции, братцы, просто кликайте сюда, братцы! Там от подарка красивей нету, братцы! Я сам валялся от их разновидностей. А теперь пойду нарисую что-нибудь вроде этих прекрасных открыток! Chao!

Anonymous said...

Прикорневая химия волос — это революционная технология, которая позволяет изменить текстуру волос и создать пышный объем прямо у корней. Этот процесс также помогает укрепить волосы, сделать их более густыми и здоровыми. Благодаря прикорневой химии волос можно создать любой желаемый образ и получить идеальную укладку без особых усилий. Если вам интересна эта инновационная процедура, то рекомендую посетить сайт https://cojo.ru/?p=370012, где вы сможете узнать подробнее о прикорневой химии, посмотреть фото до и после, а также получить консультацию у экспертов. Не упустите возможность создать красивый и ухоженный образ!

Anonymous said...

Колбаситесь с мыслями о новой татуировке в стиле Телец? Тогда загляните на этот сайт https://fotostage.com/tatuirovki/tatu-telets/. Там вы найдете много разных фотографий и картинок с вдохновением для вашего будущего арта на теле! На сайте много классных вариантов для Тельцов, которые подчеркнут вашу яркую индивидуальность. Быстрее переходите и выбирайте самую крутую идею для своей новой татуировки!

Anonymous said...

Привет, друзья! Хочу рассказать вам о прекрасной прямой стрижке для средних волос. Уверена, что многие ищут идеальную стрижку, которая будет выглядеть стильно и аккуратно. Если вы один из таких ищущих, то я нашла для вас просто потрясающую галерею с 47 фотографиями. В ней представлены самые разные варианты прямой стрижки на средние волосы, которые точно вдохновят вас на новые эксперименты с вашей прической. Уверена, что вы будете в восторге от этих фото! Не откладывайте на потом, пройдите по ссылке https://douo.ru/pryamaya-strizhka-zhenskaya-na-srednie-volosy/ и насладитесь этой фантастической галереей! Удачи вам в поисках идеальной прически!

Anonymous said...

Я, как реальный игрок, хочу порекомендовать Вам интернет-казино Вавада. Этот великолепный игровой ресурс предлагает множество увлекательных слотов и захватывающих игр, а также богатые приветственные бонусы и фриспины. Регистрация здесь очень простая и занимает всего несколько минут, а интерфейс удобный и интуитивно понятный даже для новичков. Но, что самое главное, в Вавада официальный вход с компьютера vavadaofficialsite7 top гарантирует быстрые выплаты и возможность выигрывать крупные суммы. Не упустите свой шанс на удачу, переходите по ссылке вавада официальный вход с компьютера vavadaofficialsite7 top и начинайте свой путь к большим выигрышам вместе с Вавада!

Anonymous said...

Привет, я Александр! Хочу поделиться своим восторженным отзывом о казино Вавада. Благодаря вавада зеркало рабочее на сегодня мобильная vavadacag1, я обнаружил потрясающий мир азарта онлайн. Уже с первых минут игры меня покорили великолепные слоты и щедрые бонусы. Не могу не отметить простую и быструю регистрацию, что очень удобно. Каждый раз, когда играю в Вавада, приятно осознавать, что мои выигрыши будут выплачены оперативно. Интерфейс казино простой в использовании, что другое говорит за его удобство. Помимо этого, приветственный бонус и фриспины позволяют мне начать игру с крупной суммой. Всем любителям азарта настоятельно рекомендую посетить вавада зеркало рабочее на сегодня мобильная vavadacag1 и насладиться незабываемым опытом игры в казино Вавада.

Anonymous said...

Друганы, я нашел классные картинки и фото по теме Тоби Акацуки арт! Вы не поверите, какой стиль и красота в этих работах. Обязательно зайдите на эту ссылочку тоби акацуки арт, чтобы посмотреть все это великолепие своими глазами. Там целых 33 фото, каждая уникальная и впечатляющая. Уверяю, вам точно понравится, так что не упустите возможность насладиться этими прекрасными художественными работами!

«Oldest ‹Older   201 – 208 of 208   Newer› Newest»

Post a Comment