DataContractSerializer Serialization
The DataContractSerializer provides a fast and versatile way to serialize objects to XML or binary formats. Below you will find guidance on how to use it for various scenarios.
Basic Usage
Data Contract Attributes
Streaming & Large Objects
Simple Object Serialization
// Serialize an object to XML
var person = new Person { FirstName = "John", LastName = "Doe", Age = 30 };
var serializer = new DataContractSerializer(typeof(Person));
using (var writer = new StringWriter())
using (var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings { Indent = true }))
{
serializer.WriteObject(xmlWriter, person);
xmlWriter.Flush();
Console.WriteLine(writer.ToString());
}
// Deserialize back
using (var reader = new StringReader(xmlString))
using (var xmlReader = XmlReader.Create(reader))
{
var deserialized = (Person)serializer.ReadObject(xmlReader);
Console.WriteLine($"{deserialized.FirstName} {deserialized.LastName}");
}
Resulting XML
<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Example">
<Age>30</Age>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
Customizing Serialization with DataContract
Apply [DataContract] and [DataMember] attributes to control the XML schema.
[DataContract(Name="Employee", Namespace="http://example.com/hr")]
public class Employee
{
[DataMember(Order=1)]
public string Id { get; set; }
[DataMember(Order=2, IsRequired=true)]
public string Name { get; set; }
// Not serialized
public string InternalNotes { get; set; }
}
Streaming Large Objects
When dealing with large payloads, use XmlDictionaryWriter and XmlDictionaryReader for efficient streaming.
using (var file = File.Create("large.xml"))
using (var writer = XmlDictionaryWriter.CreateBinaryWriter(file))
{
var largeObj = GetLargeObject();
var serializer = new DataContractSerializer(largeObj.GetType());
serializer.WriteObject(writer, largeObj);
}
// Reading back
using (var file = File.OpenRead("large.xml"))
using (var reader = XmlDictionaryReader.CreateBinaryReader(file, XmlDictionaryReaderQuotas.Max))
{
var serializer = new DataContractSerializer(typeof(LargeType));
var obj = (LargeType)serializer.ReadObject(reader);
}
Key Properties
| Property | Description |
|---|---|
PreserveObjectReferences | Maintains object identity in graphs containing cycles. |
MaxItemsInObjectGraph | Limits the number of items to protect against DoS attacks. |
KnownTypes | Specifies additional types that may appear in the object graph. |