Обнаружена самонарезающая петля SignalR JSON

У меня есть класс.NET, который я передаю с веб-сервера клиенту браузера через стандартный SignalR (С#, ASP.NET, Visual Studio 2013 Community).

Этот класс содержит свойство, которое является ссылкой на один и тот же класс (т.е. Ссылку на внешний ключ в терминологии базы данных).

public class Server
{
    public Guid ServerId;
    public GridLocation Location;
    public DateTime DeployedTs;
    public Server ParentServer;
}
public class GridLocation
{
    public Guid GridLocationId;
    public int X;
    public int Y;
    public Server ServerAtLocation;
}

Когда мой код отправляет только простые типы (int, String as so on), все в порядке. Как только я помещаю в класс со свойством, которое само относится к моему классу сервера и пытается отправить его клиенту браузера, я получаю сообщение об ошибке: "Newtonsoft.Json.JsonSerializationException: обнаружен цикл самореференции для свойства" ServerAtLocation "..."

Код, который пытается вызвать концентратор SignalR для передачи данных подключенным клиентам:

IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<WHub>();
hubContext.Clients.All.serverStatusChangedToClient(myServer);

Где WHub - мой хаб, который снова отлично работает без этих сложных классов.

Поскольку это приложение SignalR, я не уверен, что у меня есть контроль над сериализацией в JSON, или я? Как отправить экземпляр этого объекта, включая представление JSON объектов GridLocation и ParentServer (но без дополнительной глубины в иерархии объектов, чем это)?

0
13 нояб. '15 в 16:21
источник поделиться
1 ответ

Посмотрите на замену сериализатора IJsonSerializer здесь https://github.com/SignalR/SignalR/wiki/Extensibility, нужный вам параметр называется ReferenceLoopHandling http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm

Хотя я бы настоятельно советовал не передавать сложные графы объектов между границами приложения.

+1
13 нояб. '15 в 21:34
источник

Посмотрите другие вопросы по меткам или Задайте вопрос