C# 我是否可以选择检索protobuf net或NHibernate中的对象字段?

C# 我是否可以选择检索protobuf net或NHibernate中的对象字段?,c#,fluent-nhibernate,client-server,protobuf-net,C#,Fluent Nhibernate,Client Server,Protobuf Net,我有一个客户端-服务器应用程序,如下所示 在域中,某些类具有子类集合。有些孩子提到他们的父母 的问题是,当向服务器请求子对象时,所有其他子对象都会随响应一起返回。在许多情况下,从子对象访问父对象是非常有帮助的,我不希望为父对象单独提出请求,因为这样会导致更多的往返 正常情况下,Nhibernates延迟加载会处理这个问题,但是与protobuf net(或任何其他序列化)的交互意味着所有字段都被序列化。客户端无法直接访问数据库 是否可以限制protobuf net或Nhibernate中的对象

我有一个客户端-服务器应用程序,如下所示

在域中,某些类具有子类集合。有些孩子提到他们的父母

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

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

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

e、 g。 订单-订单项目-交货信息

订单请求限制为1意味着不加载交付信息。限制为0表示不加载订单项


另外,也可以选择停止加载引用(限制为0或无限)。这更具限制性,但实现起来可能更可行。

首先,这与protobuf net没有任何关系,因为它只是序列化器,只是序列化您给它的内容,所以你只需要给它两个层次的深度

这一切都将在你的逻辑中完成。我假设您正在序列化从nhibernate生成的实际对象。您可能想做的是,它将被用作服务的响应,并将数据从对象复制到DTO,从而只允许您深入两个级别


将数据复制到DTO可能是一件乏味的事情,有一些类似的项目旨在使您的生活在这方面更加简单,但我不确定您对映射的控制有多大,您只能指定两个级别,因此可能需要手动映射。

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

如果您有:

[ProtoMember(1)]
public int Whatever { get; set; }
以及相应的:

public bool ShouldSerializeWhatever() {
    ...
}

然后,如果shouldSerializeWhather返回true,则whather仅序列化。此模式完全基于名称。该方法可以是公共的或非公共的(但XmlSerializer仅接受用于此目的的公共方法,因此,如果使用多个序列化器,则将其保持为公共的)。

我想知道protobuf net是否有“不序列化此成员”的选项。这将允许Nhibernate的延迟加载再次生效。你是对的,我只是直接序列化域对象。我会支持DTO路由,因为虽然你可以添加属性来忽略成员,但在发送到客户端时,你可能会遇到你想序列化该成员的其他地方,所以既然您正在序列化核心对象而不是映射,那么您就回到了原点。下面是一个我所说的例子:@JamesB它确实有这个选项-我同意您的看法,至少在一定程度上,这是一个序列化程序。感谢Marc,我在IMO中以一种wierd的方式定义我的契约,可以归结为直接调用AddType,一个ddField和AddSubType。我在AddField的返回值上找到了一个方法
SetSpecified
,当给定一个方法时,该方法会执行相同的操作?@James-是的,这是一样的;命名是由于同样支持的
*指定的
BCL模式,并且该模式允许双向使用(而不是
应该序列化*
,这是单向的)。