Según tengo entendido, tengo que adornar a un nuevo miembro en una versión más nueva de mi clase con el atributo [OptionalField] cuando deserializo una versión anterior de mi clase que carece de este miembro más nuevo.¿Qué sucede con el atributo [OptionalField]?
Sin embargo, el código siguiente no arroja ninguna excepción mientras que la propiedad InnerTranslator se agregó después de serializar la clase. Compruebo que la propiedad sea nula en el método onDeserialization (que confirma que no fue serializada), pero esperaba que el código emitiera una excepción por eso. ¿El atributo [OptionalField] es opcional?
class Program
{
static void Main(string[] args)
{
var listcol = new SortedList<string,string>
{
{"Estados Unidos", "United States"},
{"Canadá", "Canada"},
{"España", "Spain"}
};
var translator = new CountryTranslator(listcol);
using (var file_stream=new FileStream("translator.bin",FileMode.Open))
{
var formatter = new BinaryFormatter();
translator = formatter.Deserialize(file_stream) as CountryTranslator;
file_stream.Close();
}
Console.ReadLine();
}
}
[Serializable]
internal class CountryTranslator:IDeserializationCallback
{
public int Count { get; set; }
public CountryTranslator(SortedList<string,string> sorted_list)
{
this.country_list = sorted_list;
inner_translator = new List<string> {"one", "two"};
}
//[OptionalField]
private List<string> inner_translator;
public List<string> InnerTranslator
{
get { return inner_translator; }
set { inner_translator = value; }
}
private SortedList<string, string> country_list;
public void OnDeserialization(object sender)
{
Debug.Assert(inner_translator == null);
Count=country_list.Count;
}
}
Acabo de descubrir que el formateador SOAP lanza una excepción cuando el interior_translator no está adornado con el atributo [OptionalField] – Dabblernl