0
点赞
收藏
分享

微信扫一扫

docker创建的rabbitmq,启动容器时报:Failed to create thread: Operation not permitted (1)

敬亭阁主 2024-05-29 阅读 35
c#jsonjava

情景再现

假设你有如下类:

public class Item {
    public int Id;
    public string Name;
}

public class Weapon: Item {
    public int CurrentAmmo;
}

public class Inventory {
    public List<Item> Items;
}

 其中你序列化的是Inventory类,Items列表里混杂着Weapon和Item,这里假定Json字符串已经正确输出。

在反序列化的过程中,你的Weapon数据并没有转换成Item,因为Items已经是显式指明了List<Item>,被Populate的实例已经明确为Item,你无法把被当成Item的Weapon强转回Weapon。

解决办法

创建一个JsonConverter,在ReadJson中读一次Json,找特定标志(比如CurrentAmmo),根据标志是否存在来创建对应类的实例。

namespace InventorySystem.Utilities
{
	public class ItemConverter : JsonConverter<Item>
	{
		public override void WriteJson(JsonWriter writer, Item value, JsonSerializer serializer){}

		public override Item ReadJson(JsonReader reader, Type objectType, Item existingValue, bool hasExistingValue,
			JsonSerializer serializer)
		{
			var jObj = JObject.Load(reader);
			if (jObj["CurrentAmmo"] != null)
			{
				return GetItem<Weapon>(jObj); 
			}

			return GetItem<Item>(jObj);
		}

		private T GetItem<T>(JObject obj)
		{
			return obj.ToObject<T>();
		}
	}
}

现在你可以在反序列化后顺利的把被当成Item的Weapon强转成Weapon了。

鸣谢

AStar

举报

相关推荐

0 条评论