根据我的理解,当我反序列化一个旧版本且没有新成员的类时,我需要在我的类的新版本中使用[OptionalField]属性来装饰一个新的成员。
然而,下面的代码在序列化该类之后添加InnerTranslator属性时不会抛出异常。虽然在onDeserialization方法中检查该属性为空(确认未序列化),但我本来预期这段代码会因此抛出异常。那么,[OptionalField]属性本身是可选的吗?
然而,下面的代码在序列化该类之后添加InnerTranslator属性时不会抛出异常。虽然在onDeserialization方法中检查该属性为空(确认未序列化),但我本来预期这段代码会因此抛出异常。那么,[OptionalField]属性本身是可选的吗?
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;
}
}