2010-05-24 2 views
16

나는 3 시간의 더 좋은 부분에 대해 머리를 때려 눕히는 데 문제가 있습니다.왜 XML 역 직렬화에 대한 OnDeserialization이 실행되지 않습니까?

[Serializable] 
public class Record 
{ 
    [XmlAttribute("actual")] public double weight { get; set; } 
    [XmlAttribute("date")] public DateTime date { get; set; } 
    [XmlIgnore]    public double trend { get; set; } 
} 

[Serializable] 
[XmlRoot("WeightStore")] 
public class SimpleWeightStore 
{ 
    [XmlArrayAttribute("Records")] 
    private List<Record> records = new List<Record>(); 
    public List<Record> Records { get { return records; } } 

    [OnDeserialized()] 
    public void OnDeserialized_Method(StreamingContext context) 
    { 
     // This code never gets called 
     Console.WriteLine("OnDeserialized"); 
    } 
} 

내가 사용하고 :

<?xml version="1.0" encoding="utf-8"?> 
<WeightStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Records> 
    <Record actual="150" date="2010-05-01T00:00:00" /> 
    <Record actual="155" date="2010-05-02T00:00:00" /> 
    </Records> 
</WeightStore> 

내가 간단한 클래스 구조를 가지고 : 나는

내가 간단한 XML 파일을 가지고 ... 내가 눈부시게 분명 뭔가를 놓친 것을 거의 확신 호출 코드와 클래스 파일 모두에서 다음과 같습니다.

using System.Xml.Serialization; 
using System.Runtime.Serialization; 

일부 호출 코드 :

SimpleWeightStore weight_store_reload = new SimpleWeightStore(); 
TextReader reader = new StringReader(xml); 
XmlSerializer deserializer = new XmlSerializer(weight_store.GetType()); 
weight_store_reload = (SimpleWeightStore)deserializer.Deserialize(reader); 

문제는 OnDeserialized_Method가 호출 될 것으로 예상된다는 것입니다.

나는 그것이 런타임 deserialization이 아닌 XML deserialization이고 아마도 잘못된 속성 이름을 사용하고 있을지도 모른다고 생각하지만 그것이 무엇인지 알 수는 없다.

의견이 있으십니까?

답변

16

XML 역 직렬화의 경우 OnDeserialized과 동일하지 않습니다. 당신이 우아한 방법으로 수동으로 하지 재미 IXmlSerializable을 구현하는 것이라고 할 수 How do you find out when you've been loaded via XML Serialization?

+0

Darn. 그것은 매우 성가신 일입니다. 오 잘. deserialize 할 때 설정되지 않은 필드를 포함하는 해결 방법을 추가하고 내부 상태가 양호 할 때 다시 설정합니다. – Jonathan

2

유일한 방법 :

는 해결이 게시물을 참조하십시오. 간단히; XmlSerializer은 직렬화 콜백을 지원하지 않습니다.

가끔 DataContractSerializer으로 바꿀 수 있지만 여전히 xml 기능을 제공하지만 이 직렬화 콜백을 지원합니다. 불행히도 xml 옵션은 으로 제한되어 있습니다. xml 구조체에서는 속성 (DataContractSerializer은 요소 만 지원)을 사용하기 때문에 xml 구조체에서는 작동하지 않습니다.

this answer에 대한 의견을 볼 수도 있습니다.

관련 문제