2

我通过以下方式有一个客户端服务器应用程序。

在此处输入图像描述

在域中,一些类有孩子的集合。有些孩子参考他们的父母。

的问题是,当向服务器请求子对象时,所有其他子对象都会随响应返回。在许多情况下,从子级访问父级对象是非常有帮助的,我宁愿不必为父级单独请求,因为这会导致更多的往返行程。

通常 Nhibernates 延迟加载会处理这个问题,但是与 protobuf-net(或任何其他序列化)的交互意味着所有字段都可以访问以进行序列化。客户端无法直接访问数据库。

是否可以限制 protobuf-net 或 Nhibernate 中的对象引用深度,以便我可以在对服务器的请求中包含一个标志,表示不要加载超过 2 个对象的深度。

例如订单 - 订单项目 - 交货信息。

一个订单请求的限制将意味着不加载交付信息。限制为 0 意味着不加载订单项。

或者,是否可以选择性地停止加载引用(限制为 0 或无限制),这更具限制性,但可能更可行。

4

2 回答 2

2

protobuf-net 支持 ShouldSerialize* 模式(与多个 BCL 实现相同,包括 IDE/PropertyGrid 和 XmlSerializer)。

如果你有:

[ProtoMember(1)]
public int Whatever { get; set; }

和一个对应的:

public bool ShouldSerializeWhatever() {
    ...
}

然后,仅当 ShouldSerializeWhatever 返回 true 时才会序列化任何内容。这种模式完全基于名称。该方法可以是公共的或非公共的(但 XmlSerializer 只接受公共方法,因此如果您使用多个序列化程序,请保持它是公共的)。

于 2012-04-25T16:54:47.420 回答
0

好吧,首先,这与 protobuf-net 没有任何关系,因为它只是序列化器,只是序列化你给它的东西,所以你只需要给它 2 层深度。

这一切都将在您的逻辑中完成。我假设您正在做的是序列化从休眠状态中出来的实际对象。您可能想要做的是引入将用作服务响应的 DTO,并将数据从您的对象复制到 DTO,从而只允许您深入 2 级。

将数据复制到 DTO 可能很乏味,并且有像AutoMapper这样的项目旨在让您的生活在这方面更简单,但我不确定您对映射的控制程度,您只能指定 2 个级别的深度,所以可能需要手动映射。

于 2012-04-25T15:37:24.540 回答