lok*_*kki 5 c# serialization json servicestack
我正在寻找将 BinaryFormatter 序列化以外的其他内容引入我的应用程序以最终与 Redis 一起使用的方法。ServiceStack JSON 是我想使用的,但它可以用接口做我需要的吗?它可以序列化(通过插入自定义 __type 属性)
public IAsset Content;
Run Code Online (Sandbox Code Playgroud)
但不是
public List<IAsset> Contents;
Run Code Online (Sandbox Code Playgroud)
- 序列化数据中的列表为空。有没有办法做到这一点 - 序列化接口类型列表?
该应用程序又大又旧,它使用的对象的形状可能不允许更改。谢谢
引用自http://www.servicestack.net/docs/framework/release-notes
你可能不需要做太多:)
JSON 和 JSV 文本序列化器现在支持使用接口/抽象或对象类型对 DTO 进行序列化和反序列化。除此之外,这允许您拥有一个 IInterface 属性,该属性在序列化时将在 __type 属性字段中包含其具体类型信息(类似于其他 JSON 序列化程序),该字段在序列化时填充该具体类型的实例(如果存在)。
[...]
注意:此功能会自动添加到所有抽象/接口/对象类型,即您不需要包含任何 [KnownType] 属性即可利用它。
不多:
public interface IAsset
{
string Bling { get; set; }
}
public class AAsset : IAsset
{
public string Bling { get; set; }
public override string ToString()
{
return "A" + Bling;
}
}
public class BAsset : IAsset
{
public string Bling { get; set; }
public override string ToString()
{
return "B" + Bling;
}
}
public class AssetBag
{
[JsonProperty(TypeNameHandling = TypeNameHandling.None)]
public List<IAsset> Assets { get; set; }
}
class Program
{
static void Main(string[] args)
{
try
{
var bag = new AssetBag
{
Assets = new List<IAsset> {new AAsset {Bling = "Oho"}, new BAsset() {Bling = "Aha"}}
};
string json = JsonConvert.SerializeObject(bag, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto
});
var anotherBag = JsonConvert.DeserializeObject<AssetBag>(json, new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto
});
Run Code Online (Sandbox Code Playgroud)