簡體   English   中英

JsonSerializer未序列化派生的類屬性

[英]JsonSerializer not serializing derived class properties

我有一個類似下面的類,該類已添加到項目/解決方案中作為參考

public class FileContents
{
    public List<RecordBase> Records { get; set; }
}

public class RecordBase
{
    public int LineNumber { get; set; }
}

很少有其他類沒有添加到引用中,而是動態加載的,這些類是從RecordBase類派生的,下面是如何加載的代碼段

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)
}

下面是前面提到的另一個類,它是從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對象進行序列化時,它會跳過派生類中可用的屬性(例如,來自RecordStyleA)

這里派生(RecordStyleA)類是有條件加載的,其屬性也可能根據條件而有所不同。 驅動類是動態創建的。

請幫我解決這個問題

首先,應避免DTO中的繼承 ,如果必須使用它,則應該使基類abstract以便ServiceStack序列化程序知道何時發出動態類型信息。

請注意,用於序列化為JSON的2種最常見的API是使用靜態JsonSerializer類,例如:

var json = JsonSerializer.SerializeToString(result);

.ToJson()/.FromJson()擴展方法,例如:

var json = result.ToJson();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM