Serializing private member data
You could use DataContractSerializer
(but note you can't use xml attributes - only xml elements):
using System;using System.Runtime.Serialization;using System.Xml;[DataContract]class MyObject { public MyObject(Guid id) { this.id = id; } [DataMember(Name="Id")] private Guid id; public Guid Id { get {return id;}}}static class Program { static void Main() { var ser = new DataContractSerializer(typeof(MyObject)); var obj = new MyObject(Guid.NewGuid()); using(XmlWriter xw = XmlWriter.Create(Console.Out)) { ser.WriteObject(xw, obj); } }}
Alternatively, you can implement IXmlSerializable
and do everything yourself - but this works with XmlSerializer
, at least.
You could use the System.Runtime.Serialization.NetDataContractSerializer
. It is more powerful and fixes some issues of the classic Xml Serializer.
Note that there are different attributes for this one.
[DataContract]public class X{ [DataMember] public Guid Id { get; private set; }}NetDataContractSerializer serializer = new NetDataContractSerializer();TextWriter tw = new StreamWriter(_location);serializer.Serialize(tw, obj);
Edit:
Update based on Marc's comment: You should probably use System.Runtime.Serialization.DataContractSerializer
for your case to get a clean XML. The rest of the code is the same.
Read only fields will not be serialized using the XmlSerializer
, this is due to the nature of the readonly
keyword
From MSDN:
The readonly keyword is a modifier that you can use on fields. When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.
So... you would pretty much need to set the fields value in the default constructor...