1. 对象类型
后端有Bridge(桥)对象,Bridge内部有List<Pier>(桥墩集合),每个Pier内部都有一个Foundation(基础),采用EFCore进行的ORM数据库映射。同时,Pier和Foundation都是基类,各自有若干派生类。每一个实例化的对象均为其派生类。
需要将该对象进行序列化与反序列化操作,要求过程中不丢失派生类属性。
/// <summary>
/// 全桥
/// </summary>
public class Bridge
{
int Id;
public virtual List<Pier> Piers {
get; set; }
}
/// <summary>
/// 桥墩基类
/// </summary>
public class Pier
{
int Id;
public virtual Foundation Foundation {
get; set; }
public string Discriminator {
get; set; }
}
/// <summary>
/// 基础基类
/// </summary>
public class Foundation
{
int Id;
public string Discriminator {
get; set; }
}
/// <summary>
/// 单柱墩
/// </summary>
public class SingleColumnPier : Pier
{
// 顶帽
public virtual Coping {
get; set; }
// 托盘
public virtual Tray {
get; set; }
// 墩身
public virtual OneColumn {
get; set; }
}
/// <summary>
/// 双柱墩
/// </summary>
public class DoubleColumnPier : Pier
{
}
/// <summary>
/// 桩基础
/// </summary>
public class PileFoundation: Foundation
{
}
/// <summary>
/// 扩大基础
/// </summary>
public class SpreadFoundation : Foundation
{
}
2. 直接对Entity对象进行序列化
当采用System.Text.Json时,默认无法获得子类属性,根据微软官方文档( 如何使用 System.Text.Json 序列化派生类的属性 | Microsoft Learn),需要采用object类型定义Pier和Foundation才能获得子类属性,但这样做将导致无法完成ORM。
当采用NewtonSoft.Json时,可以获取子类常规属性,但是对于复杂属性未进行序列化(如本例Pier里面的OneColumn、Coping、Tray等)。可能是由于懒加载的原因,复杂属性未加载进来。
采用Entity对象除了懒加载生成的代理对象造成不