Microsoft

.NET API Reference

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

PropertyDescription
PreserveObjectReferencesMaintains object identity in graphs containing cycles.
MaxItemsInObjectGraphLimits the number of items to protect against DoS attacks.
KnownTypesSpecifies additional types that may appear in the object graph.

Related Topics