【发布时间】:2016-10-23 00:11:36
【问题描述】:
如何使用 C# 序列化框架进行引用修复(后处理)?
我有一个对象图,其中的对象引用其他对象。它们都实现了ISerializable 接口并且它们都有实例ID,因此在序列化状态下表示引用很容易。
关键在于,当调用反序列化构造函数时,该对象引用的所有对象可能都没有被反序列化,因此无法将引用设置为有效对象。而且我找不到任何方法可以连接到 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的代码是什么样子的?
-
这适用于现有/遗留代码吗?如果没有并且您想使用 XML,我会查看
XmlSerializer。这比使用ISerializer接口和XmlFormatter更容易使用并且需要更少的代码。 -
如果你觉得我的回答对你有帮助,你可以accept my answer。
标签: c# serialization deserialization