当前位置:  开发笔记 > 数据库 > 正文

.Net二进制序列化 - 如何限制对象图?

如何解决《.Net二进制序列化-如何限制对象图?》经验,为你挑选了1个好方法。

我有一个对象,我希望尽可能高效地在进程之间进行序列化和分发.对象本身具有对另一个对象的引用,如下所示:

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属性中.

这是限制序列化对象图的任务的有效方法吗?有没有更好的方法呢?



1> leppie..:

我不确定我在这里遗失了什么.

只需NonSerialized在您不想序列化的字段上使用该属性即可.

然后查看SerializationSurrogate以在反序列化时修复引用.

我使用类似的方法二进制序列化LINQ2SQL对象.

更新:

更好的主意(忘了这一点).使用OnDeserializedAttribute,这很容易使用.

使用Surrogate方法将允许您返回该对象的另一个实例(如果已经加载到内存中).我使用它(在IronScheme中)来修复对运行时已存在的盒装值类型的引用.

更新2:

您可以在以下文件的中间查看ISerializationSurrogate的示例.(我提前为丑陋道歉).

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有