JsonSerializer 未序列化派生的 class 属性
JsonSerializer not serializing derived class properties
我有一个像下面这样的 class 添加到 project/solution 作为参考
public class FileContents
{
public List<RecordBase> Records { get; set; }
}
public class RecordBase
{
public int LineNumber { get; set; }
}
很少有其他 class 没有添加到引用中但动态加载,那些 class 是从 RecordBase 派生的 class 以下是有关如何加载的片段
var fileContents = new FileContents();
var dll = Assembly.LoadFile(derivedClassesAssemblyLocation);
Type type = dll.GetExportedTypes().Where(a =>
a.Name.Equals(className)).FirstOrDefault();
if (type != null && type.Name == className)
{
dynamic instance = Activator.CreateInstance(type);
//All properties are populated to the instance
//.....
//.....
fileContents.Records.Add(instance)
}
下面是前面提到的另一个class是从RecordBase
派生出来的
public class RecordStyleA : RecordBase
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
}
加载和序列化
var result = new FileContents();
//Logic to load ....
var serializer = new ServiceStack.Text.JsonStringSerializer();
var json = serializer.SerializeToString(result);
在这里,当我尝试序列化 FileContents 对象时,它会跳过派生 class(例如来自 RecordStyleA)
中可用的属性
Here Derived (RecordStyleA) class 是有条件加载的,其 属性 也可能因条件而异。驱动 classes 是即时创建的。
请帮我解决这个问题
首先inheritance in DTO's should be avoided,如果你必须使用它,那么你应该创建你的基础class abstract
,这样ServiceStack Serializer就知道什么时候发出动态类型信息。
请注意,序列化为 JSON 的 2 个最常见的 API 是使用静态 JsonSerializer
class,例如:
var json = JsonSerializer.SerializeToString(result);
或 .ToJson()/.FromJson()
扩展方法,例如:
var json = result.ToJson();
我有一个像下面这样的 class 添加到 project/solution 作为参考
public class FileContents
{
public List<RecordBase> Records { get; set; }
}
public class RecordBase
{
public int LineNumber { get; set; }
}
很少有其他 class 没有添加到引用中但动态加载,那些 class 是从 RecordBase 派生的 class 以下是有关如何加载的片段
var fileContents = new FileContents();
var dll = Assembly.LoadFile(derivedClassesAssemblyLocation);
Type type = dll.GetExportedTypes().Where(a =>
a.Name.Equals(className)).FirstOrDefault();
if (type != null && type.Name == className)
{
dynamic instance = Activator.CreateInstance(type);
//All properties are populated to the instance
//.....
//.....
fileContents.Records.Add(instance)
}
下面是前面提到的另一个class是从RecordBase
派生出来的public class RecordStyleA : RecordBase
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
}
加载和序列化
var result = new FileContents();
//Logic to load ....
var serializer = new ServiceStack.Text.JsonStringSerializer();
var json = serializer.SerializeToString(result);
在这里,当我尝试序列化 FileContents 对象时,它会跳过派生 class(例如来自 RecordStyleA)
中可用的属性Here Derived (RecordStyleA) class 是有条件加载的,其 属性 也可能因条件而异。驱动 classes 是即时创建的。
请帮我解决这个问题
首先inheritance in DTO's should be avoided,如果你必须使用它,那么你应该创建你的基础class abstract
,这样ServiceStack Serializer就知道什么时候发出动态类型信息。
请注意,序列化为 JSON 的 2 个最常见的 API 是使用静态 JsonSerializer
class,例如:
var json = JsonSerializer.SerializeToString(result);
或 .ToJson()/.FromJson()
扩展方法,例如:
var json = result.ToJson();