Как сериализовать ссылки на то, чтобы первая ширина с json.netC#

Место общения программистов C#
Ответить
Anonymous
 Как сериализовать ссылки на то, чтобы первая ширина с json.net

Сообщение Anonymous »

Я использую json.net для сериализации и десериализации объекта. Этот объект по сути является сеткой для головоломки и содержит 3 основных свойства. Квадраты, вершины и ребра. />

Код: Выделить всё

public class Puzzle
{
public Size Size { get; set; }
public List Edges { get; set; }
public Square[][] Squares { get; set; }
public Vertex[][] Vertices { get; set; }

// ...
}
< /code>
Дело в том, что все 3 из этих типов имеют ссылки друг на друга. Например, один край помнит, какие две вершины он подключается друг к другу. И один квадрат знает о своих соседних квадратах и ​​о краю, который отделяет его от каждого из них < /p>
public abstract class Edge
{
public Vertex OriginVertex { get; set; }
public Vertex DestinationVertex { get; set; }
public Square LeftSquare { get; set; }
public Square RightSquare { get; set; }
public EdgeDirection Direction { get; set; }

// ...
}
Я использую json.net для сериализации этого типа головоломки, и я использую сохранение всех ссылок, чтобы эта структура была способна совершить обратное путешествие. < Br />

Код: Выделить всё

private JsonSerializer _serializer = new JsonSerializer()
{
Formatting = Formatting.Indented,
PreserveReferencesHandling = PreserveReferencesHandling.All,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
Converters = { new ArrayReferencePreservingConverter()},
TypeNameHandling = TypeNameHandling.Auto
};
< /code>
Это приводит к JSON, который имеет объекты с свойствами $ id, и в других местах, которые определяются только как $ ref, чтобы избежать дублирования. < /p>
Проблема в том, что, поскольку сериализация-это первая глубина, это означает, что, как только одно из свойств головоломки сериализуется через большую петлю круговых зависимостей, каждая отдельная вершина/квадрат/край сериализируется там, как подэлементы из какой -либо собственности в первую очередь сериализируется. Это приводит к безумной глубине в файле JSON, и даже если бы не было проблем с кодом, было бы довольно уродливо и с ним очень трудно работать. json "src =" https://i.sstatic.net/bfdxn.png "/> 
Затем, когда это первое свойство сделано сериализуется, следующие два свойства очень плоские, и только ссылки, потому что все их объекты были поражены один раз в глубоких спагетти -предварительных. i.sstatic.net/xqdyw.png " /> < /p>
То, что я хотел бы, это то, что все 3 основных свойства сериализуют себя в ширине. Это позволило бы каждому объекту появиться ровно на один раз ниже самой головоломки, близко к корне, и тогда эти объекты могут относиться друг к другу через значения $ ref и $ id. < /P>
Это значительно уменьшит глубину моего файла JSON, помогая как с кодом, так и с читаемостью. По сути, у меня есть структура, которая имеет больше всего 5 или 6 максимум, но с моей текущей сериализацией моя глубина растет с размером головоломки вместо того, чтобы быть постоянным на основе моего кода. < /P>
Это не помогает переупорядочить основные свойства в головоломке, так как все 3 из них относятся друг к другу, и проблема остается неизменной. Какой бы ни был сериализован, сначала в конечном итоге сериализует все внутри себя. Как полный объект », но я не смог найти такой атрибут. Если это возможно, я хотел бы знать, как. < /P>
public abstract class Edge
{
[JsonSerializeAsReferenceIfPossible]
public Vertex OriginVertex { get; set; }

[JsonSerializeAsReferenceIfPossible]
public Vertex DestinationVertex { get; set; }

[JsonSerializeAsReferenceIfPossible]
public Square LeftSquare { get; set; }

[JsonSerializeAsReferenceIfPossible]
public Square RightSquare { get; set; }

public EdgeDirection Direction { get; set; }
}
Если выше невозможно, я открыт для любой идеи или предложения относительно того, как достичь этого фиксированного глубинного JSON, который был бы идеальным как для читаемости человека и машины.


Подробнее здесь: https://stackoverflow.com/questions/743 ... h-json-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»