【问题标题】:Designing Classes With Interface In C# (JSON.NET)在 C# (JSON.NET) 中使用接口设计类
【发布时间】:2011-03-21 15:56:49
【问题描述】:

我正在为游戏设计一个项目化系统。我正在创建一堆接口(IItem、IConsumable、IEquipable、IWeapon 等)来定义物品可以使用的功能类型,然后定义一些类(武器、药水等)实际项目类型。

现在,当保存播放器时,数据将存储为 JSON 文件(使用 JSON.NET 库),并将包含包含这些物品的播放器库存。问题是,当我在读取文件时尝试将 JSON 文件反序列化为对象时,我如何能够告诉 JSON.NET 库这是什么类型的类?

我想到但还没有时间尝试的一件事是,我所有被序列化为 JSON 的对象都有一个与 JSON.NET 库结合使用的对象的 DTO 版本。我想尝试的是,也许我可以在 DTO 中添加一个名为 ClassType 的属性,然后在将文件读入应用程序时,我会首先将对象作为匿名类型读入。然后基于 ClassType 属性,我会将其转换为正确的类型。我遇到的两个问题是:1. 这似乎是一个非常丑陋的解决方案;2. 我什至不确定这是否可能。

【问题讨论】:

标签: c# json interface class-design json.net


【解决方案1】:

(复制自this question

在这种情况下,我无法控制传入的 JSON(因此无法确保它包含 $type 属性),我编写了一个自定义转换器,只允许您显式指定具体类型:

public class Model
{
    [JsonConverter(typeof(ConcreteTypeConverter<Something>))]
    public ISomething TheThing { get; set; }
}

这只是使用来自 Json.Net 的默认序列化器实现,同时明确指定具体类型。

this blog post 上提供了源代码和概述。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我会试一试(希望该功能适用​​于库的 2.0 版本,因为我必须使用该版本)。
    • 刚刚检查过。不,2.0 版不支持 TypeNameHandling。
    • 那太糟糕了,我猜得另找办法了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多