Я использую 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, который был бы идеальным как для читаемости человека и машины.
Я использую json.net для сериализации и десериализации объекта. Этот объект по сути является сеткой для головоломки и содержит 3 основных свойства. Квадраты, вершины и ребра. />[code]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; }
// ... } [/code] Я использую json.net для сериализации этого типа головоломки, и я использую сохранение всех ссылок, чтобы эта структура была способна совершить обратное путешествие. < Br />[code]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; } } [/code] Если выше невозможно, я открыт для любой идеи или предложения относительно того, как достичь этого фиксированного глубинного JSON, который был бы идеальным как для читаемости человека и машины.