using System.Xml.Serialization;
namespace Custom.Xml.Serialization
{
public interface IXmlDeserializationCallback
{
void OnXmlDeserialization(object sender);
}
public class CustomXmlSerializer : XmlSerializer
{
protected override object Deserialize(XmlSerializationReader reader)
{
var result = base.Deserialize(reader);
var deserializedCallback = result as IXmlDeserializationCallback;
if (deserializedCallback != null)
{
deserializedCallback.OnXmlDeserialization(this);
}
return result;
}
}
}
kế thừa lớp học của bạn từ IXmlDeserializationCallback và triển khai logic đồng bộ hóa của bạn trong phương pháp OnXmlDeserialization.
tín dụng cho How do you find out when you've been loaded via XML Serialization?
UPDATE:
tốt, như xa như tôi hiểu được topicstarter, ông không muốn "bằng tay" gọi một số logic sau mỗi deserialization XML. Vì vậy, thay vì thực hiện việc này:
public class MyEntity
{
public string SomeData { get; set; }
public void FixReferences()
{
// call after deserialization
// ...
}
}
foreach (var xmlData in xmlArray)
{
var xmlSer = new XmlSerializer(typeof(MyEntity));
using (var memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData)))
{
var entity = (MyEntity)xmlSer.Deserialize(memStream);
entity.FixReferences();
// do something else with the entity
// ...
}
}
anh ấy muốn thực hiện chỉ deserialization, mà không phải lo lắng về các cuộc gọi thêm. Trong trường hợp này, giải pháp đề xuất là sạch/đơn giản - bạn chỉ cần kế thừa lớp thực thể của bạn từ giao diện IXmlDeserializationCallback, và thay thế XmlSerializer với CustomXmlSerializer:
public class MyEntity: IXmlDeserializationCallback
{
public string SomeData { get; set; }
private void FixReferences()
{
// call after deserialization
// ...
}
public void OnXmlDeserialization(object sender)
{
FixReferences();
}
}
foreach (var xmlData in xmlArray)
{
var xmlSer = new CustomXmlSerializer(typeof(MyEntity));
using (var memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData)))
{
var entity = (MyEntity)xmlSer.Deserialize(memStream);
// entity.FixReferences(); - will be called automatically
// do something else with the entity
// ...
}
}
Bạn có thể làm rõ chính xác ý của bạn là gì? "Tôi được gọi để gọi một phần mềm đồng bộ hóa tham chiếu"? Vui lòng giải thích _why_ điều này là cần thiết. – Oded
cho lớp ví dụ bao gồm: thành viên A, MemberB và danh sách thành viên có xmlIgnore và nên contian thành viên A và B thường xuyên desrialization sẽ tạo ra các trường hợp khác nhau cho danh sách và thành viên tôi cần danh sách để tham khảo các thành viên được deserilized . câu hỏi làm thế nào để tạo ra một phương pháp desrialization bài? hoặc thực hiện và gọi điện cho việc deserialization thường xuyên – user271077
Bạn có thể cung cấp một ví dụ không? Vẫn chưa rõ những gì bạn đang cố gắng hoàn thành. Bạn muốn điền các trường thành viên khác với 'XmlIgnore' vào một đối tượng sau mỗi lần deserialization? – mellamokb