필자는이 새로운 멤버가없는 이전 버전의 버전을 deserialize 할 때 [OptionalField] 특성을 사용하여 새 클래스의 새 멤버에 새 멤버를 추가해야합니다.[OptionalField] 속성은 무엇입니까?
그러나 InnerTranslator 속성이 클래스를 serialize 한 후에 추가 된 동안 아래 코드는 예외를 throw하지 않습니다. onDeserialization 메서드에서 (그것이 직렬화되지 않았 음을 확인하는) null이 될 속성을 확인합니다. 그러나 예외로 인해 예외가 throw 될 것으로 예상됩니다. [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;
}
}
inner_translator가 [OptionalField] 속성으로 장식되어 있지 않을 때 SOAP 포맷터가 예외를 throw한다는 것을 알게되었습니다. – Dabblernl