DataContractXmlSerializer

CSharp · Console

/Program.cs

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

class Program
{
	static void Main(string[] args)
	{
		var serializer = new DataContractXmlSerializer<Model>();

		var xml = "<Model><Id>5</Id></Model>";

		var model = serializer.Deserialize(xml);

		Console.WriteLine($"model.Id = {model.Id}");

		var newXml = serializer.Serialize(model);

		Console.WriteLine($"newXml = \"{newXml}\"");
	}
}

public class DataContractXmlSerializer<T>
{
	private readonly DataContractSerializer _dataContractSerializer;

	public DataContractXmlSerializer()
	{
		_ = Attribute.GetCustomAttribute(typeof(T), typeof(DataContractAttribute))
			?? throw new InvalidOperationException($"Type {typeof(T)} does not contain Attribute of type {typeof(DataContractAttribute)}.");

		_dataContractSerializer = new DataContractSerializer(typeof(T));
	}

	public T Deserialize(string xml)
	{
		var xmlData = Encoding.UTF8.GetBytes(xml);
		var xmlStream = new MemoryStream(xmlData);

		using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(xmlStream, Encoding.UTF8, new XmlDictionaryReaderQuotas(), null))
		{
			return (T)_dataContractSerializer.ReadObject(reader);
		}
	}

	public string Serialize(T obj)
	{
		using (MemoryStream memoryStream = new MemoryStream())
		{
			_dataContractSerializer.WriteObject(memoryStream, obj);
			return Encoding.UTF8.GetString(memoryStream.ToArray());
		}
	}
}

[DataContract(Namespace="")]
public class Model
{
	public Model(int id)
	{
		this._id = id;
	}

	[DataMember(Name="Id")]
	private int _id;

	public int Id { get { return this._id; } }
}
;