【发布时间】:2016-12-07 04:10:46
【问题描述】:
考虑一个台球应用程序。您可能需要的一种模型是Match,它引用了多个Game 对象,每个Game 对象都包含该游戏的得分数据。当然,Match 和Game 都引用了Player,因为你需要知道谁在玩。所以给定这个相对简单的模型:
class Match
{
Player Player1;
Player Player2;
List<Game> Games;
}
class Game
{
Player Player1;
Player Player2;
// ... scoring data
}
class Player
{
string PlayerName;
}
我们希望将匹配保存到某个存储中(类型并不重要,但例如,假设我们在 Azure 中存储 JSON 序列化对象的 blob)。
我们可以这样做的简单方法是:
storage.SaveBlob(JsonConvert.SerializeObject(myMatch));
但这会保存Player1 和Player2 的多个副本 - 一个用于比赛,一个用于比赛中的每场比赛。
我们可以将Game 更改为:
class Game
{
[JsonIgnore]
Player Player1;
[JsonIgnore]
Player Player2;
// ... scoring data
}
这解决了我们的重复播放器问题,但现在我们遇到了一个问题,即反序列化需要 Match 修复其所有引用的 Game 对象的数据成员,以及更复杂场景中的任何其他类似对象。
我们可以再次更新Game:
class Game
{
[JsonIgnore]
Match Match;
[JsonIgnore]
Player Player1 => Match.Player1;
[JsonIgnore]
Player Player2 => Match.Player2;
// ... scoring data
}
这简化了问题,但仍然需要Match 反序列化来修复其属性。此外,添加这种类型的抽象会产生Game 对象必须作为Match 的一部分的问题。从概念上讲,情况并非如此(没有理由你不能拥有一个 Game 而不是完整 Match 的一部分),所以这似乎是一种糟糕的方法。
另一种选择可能是将Match 更改为:
class Match
{
Player Player1 => Games.First().Player1;
Player Player2 => Games.First().Player2;
List<Game> Games;
}
这种方法解决了我们让Player 对象保存多个类的问题,但会导致大量数据重复。此外,如果我们将所有这些数据保存到存储中,然后 Player 更改它们的评级级别,例如,我们通常希望也更新所有引用(在某些情况下这可能不是这种情况,但让我们暂时忽略)。
目标是在保持一定数量的数据规范化的同时进行干净的序列化/反序列化。那么……应该怎么办?这不是常见问题吗?
【问题讨论】:
-
这是一个非常广泛的问题,有许多可能的答案(有多种类型的数据存储可用 - 关系、列、键/值、图形、文档)以及这些类别中的许多品牌的数据库。跨度>
-
你没有错,但有几个正确答案的问题也不错。我很高兴听到任何适合这种情况的消息:)
标签: c# json azure serialization