gpt4 book ai didi

wcf - 如何通过 protobuf 在 WCF 中避免重复对象

转载 作者:行者123 更新时间:2023-12-04 12:51:43 27 4
gpt4 key购买 nike

我有一个小的单元测试来测试循环依赖。

我的对象如下:

[ProtoContract]
public class Node
{
[ProtoMember(1)]
public String Name { get; set; }

[ProtoMember(2,AsReference = true)]
public List<Node> Childs { get; set; }

public Node()
{
Childs = new List<Node>();
}
}

以及以下服务:
[ServiceContract]
public interface INodeService : IService
{
[OperationContract]
Task<Node> GetCyclicNodes();
}

public class NodeService : Service, INodeService
{
public async Task<int> Add(int a, int b)
{
return a + b;
}

public async Task<Node> GetCyclicNodes()
{
Node nodeA = new Node() {Name = "Node A"};
Node nodeB = new Node() {Name = "Node B"};
Node nodeC = new Node() {Name = "Node C"};
nodeA.Childs.Add(nodeB);
nodeB.Childs.Add(nodeC);
nodeC.Childs.Add(nodeA);
return nodeA;
}
}

在客户端,我计算对象的数量:
    private int CountNodes(Node node, List<Node> countedNodes = null)
{
if (countedNodes == null)
{
countedNodes = new List<Node>();
}
if (countedNodes.Contains(node))
{
return 0;
}
else
{
countedNodes.Add(node);
int count = 1;
foreach (Node nodeChild in node.Childs)
{
count += CountNodes(nodeChild, countedNodes);
}
return count;
}
}

当我调用它时,我希望收到整个层次结构,具有 3 个唯一的对象实例(一个用于“节点 A”、“节点 B”、“节点 C”)。

但似乎我有 4 个不同的对象,是对象 A 的两倍。

由于我的类(class)不是 AsReferenceDefault ,我有点害怕它没有看到它与它得到的物体是同一个物体。

就我而言,我有一个非常大的商业模型(约 500 个不同的模型),它们都来自同一个根类。每个类都可以在技术上(从模型的角度来看)被另一个类引用,很明显每个类都是一个并且只有一个所有者,而其他类只引用它。
这是我可以用 protobuf 做的事情吗?

因为即使我不知道在使用引用时幕后发生了什么,我有点害怕这意味着每个字段都有一个唯一的 ID,即使它们没有被引用

编辑

事实上,即使在设置 AsReferenceDefault = true 时在 ProtoContract ,我仍然得到 4 个对象而不是 3 个,现在我有点迷失了。

编辑 2

我做了另一个测试,我试图有一个 Container 类(我的不同操作现在返回一些 Task<Container<Node>> 。这个 Container 只包含一个标记为 AsReference = true 的属性。现在它可以工作了,我只有 3 个实例。

但似乎暗示我没有正确理解 AsReference机制。我在想可能有一个对象的“所有者”,它没有标有 AsReference=true ,而所有其他也引用此对象的将是 AsReference =true .但是如果我理解正确,这会导致有 2 个不同的实例吗?

如果是,我不明白设置 AsReference = true 的好处过 AsReferenceDefault ?

我理解正确吗?

最佳答案

对我来说,问题似乎类似于 this question我们意识到根级实体的问题。

我们还拥有的是,对于子对象,引用是正确的,但如果根项目再次被引用,反序列化后就会有一个副本。

我们使用了一段时间(然后我们切换到纯 JSON)的解决方法是添加一个额外的根节点。使用这个额外的根节点引用正确反序列化的地方。因此,这可能是您也可以尝试的解决方法。

关于wcf - 如何通过 protobuf 在 WCF 中避免重复对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143602/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com