C# 직렬화 프레임 워크를 사용하여 참조 픽스 업 (사후 처리)을 수행하는 방법은 무엇입니까?C에서 직렬화 복원 중 참조 픽스 업을 수행하는 방법 #?
다른 개체를 참조하는 개체가있는 개체 그래프가 있습니다. 그들은 모두 ISerializable
인터페이스를 구현하며 모두 인스턴스 ID를 가지므로 직렬화 된 상태로 참조를 나타내는 것은 쉽습니다.
krux는 deserialization 생성자가 호출 될 때 해당 객체가 참조하는 모든 객체가 직렬화되지 않았을 수 있으므로 참조를 유효한 객체로 설정할 수 없습니다. 그리고 참조 픽스 업을 수행하기 위해 C# 직렬화 프레임 워크에서 사후 처리 단계에 연결하는 방법을 찾을 수 없습니다. 그것을 할 수있는 방법이 있습니까?
요청에 따라 여기에 문제가 강조된 고풍스러운 수업이 있습니다.
[Serializable]
public class Pony : ISerializable
{
public int Id { get; set; }
public string Name { get; set; }
public Pony BFF { get; set; }
public Pony() {}
private Pony(SerializationInfo info, StreamingContext context) {
Id = info.GetInt32("id");
Name = info.GetString("name");
var bffId = info.GetInt32("BFFId");
BFF = null; // <===== Fixup! Find Pony instance with id == bffId
}
public void GetObjectData(SerializationInfo info, StreamingContext ontext) {
info.AddValue("id", Id);
info.AddValue("name", Name);
info.AddValue("BFFId", BFF.Id);
}
}
그리고 여기이 (비) 직렬화 코드 :
var rd = new Pony { Id = 1, Name = "Rainbow Dash" };
var fs = new Pony { Id = 2, Name = "Fluttershy", BFF = rd };
rd.BFF = fs;
var ponies = new List<Pony>{ rd, fs };
Stream stream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(stream, ponies);
stream.Seek(0, SeekOrigin.Begin);
var deserializedPonies = (List<Pony>)formatter.Deserialize(stream);
이 질문은 내 문제가 해결되지 않습니다 .net XML Serialization - Storing Reference instead of Object Copy
가 나는 경우 BinaryFormatter +를 ISerializable을 사용하고 싶습니다 직렬화를위한 프레임 워크이며 XmlFormater로 전환하지 않습니다.
어떻게 코드 모양은 필요 같은 직렬화 복원시에 ID를 해결하기 위해 무엇입니까? –
http://stackoverflow.com/questions/1617528/net-xml-serialization-storing-reference-instead-of-object-copy 이미 확인 했습니까? – Fruchtzwerg
기존 코드/기존 코드 용입니까? 그렇지 않다면 XML을 사용하기 위해'XmlSerializer'를 살펴볼 것입니다. 이것은 사용하기가 훨씬 쉬우 며'ISerializer' 인터페이스와'XmlFormatter'를 사용하는 것보다 훨씬 적은 코드가 필요합니다. – Igor