Usted puede cambiar el valor del miembro de datos antes de la serialización (el valor por defecto, por lo que no consigue en serie), pero después de la serialización que cambiarla detrás - utilizando las devoluciones de llamada [OnSerializing]
y [OnSerialized]
(más información en this blog post). Esto funciona bien siempre que no tenga múltiples hilos serializando el objeto al mismo tiempo.
public class StackOverflow_8010677
{
[DataContract(Name = "Person", Namespace = "")]
public class Person
{
[DataMember]
public string Name;
[DataMember(EmitDefaultValue = false)]
public int Age;
private int ageSaved;
[OnSerializing]
void OnSerializing(StreamingContext context)
{
this.ageSaved = this.Age;
this.Age = default(int); // will not be serialized
}
[OnSerialized]
void OnSerialized(StreamingContext context)
{
this.Age = this.ageSaved;
}
public override string ToString()
{
return string.Format("Person[Name={0},Age={1}]", this.Name, this.Age);
}
}
public static void Test()
{
Person p1 = new Person { Name = "Jane Roe", Age = 23 };
MemoryStream ms = new MemoryStream();
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
Console.WriteLine("Serializing: {0}", p1);
dcs.WriteObject(ms, p1);
Console.WriteLine(" ==> {0}", Encoding.UTF8.GetString(ms.ToArray()));
Console.WriteLine(" ==> After serialization: {0}", p1);
Console.WriteLine();
Console.WriteLine("Deserializing a XML which contains the Age member");
const string XML = "<Person><Age>33</Age><Name>John Doe</Name></Person>";
Person p2 = (Person)dcs.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(XML)));
Console.WriteLine(" ==> {0}", p2);
}
}
No entiendo. ¿Cómo puede deserializar lo que no se serializa? – sehe
@sehe He visto muchos escenarios donde se desea; no es raro –
@MarcGravell: Ah, bueno, supongo que quiere decir que los datos podrían provenir de alguna otra fuente_. Pude ver que eso sucedía con la serialización de XML. Sin embargo, no es obvio (en general, no se puede deserializar lo que no se serializa) – sehe