我有一个对象,我希望尽可能高效地在进程之间进行序列化和分发.对象本身具有对另一个对象的引用,如下所示:
public class Foo { // Unique Identifier: public int Id; public Bar Bar; } public class Bar { // Unique Identifier: public int Id; }
问题是我只想序列化Foo并通过线路运行它.我宁愿不把Bar包含在我通过电线发送的内容中,因为它在另一边是已知的并且发送它会浪费我的"带宽".
我想做的是这样的:
在序列化时,我将对Bar(Foo.Bar)的引用序列化为包含以下内容的int:Bar.Id(这是Bar实例的唯一标识符)
只有Foo才会通过网络发送(包含int而不是Bar属性).
在反序列化时,我得到int,从存储库中获取正确的Bar并将其放入Foo.Bar属性中.
这是限制序列化对象图的任务的有效方法吗?有没有更好的方法呢?
我不确定我在这里遗失了什么.
只需NonSerialized
在您不想序列化的字段上使用该属性即可.
然后查看SerializationSurrogate以在反序列化时修复引用.
我使用类似的方法二进制序列化LINQ2SQL对象.
更新:
更好的主意(忘了这一点).使用OnDeserializedAttribute,这很容易使用.
使用Surrogate方法将允许您返回该对象的另一个实例(如果已经加载到内存中).我使用它(在IronScheme中)来修复对运行时已存在的盒装值类型的引用.
更新2:
您可以在以下文件的中间查看ISerializationSurrogate的示例.(我提前为丑陋道歉).