.net带派生类的复杂对象序列化与反序列化问题与解决方案

博客探讨了在.NET中处理包含派生类的复杂对象序列化和反序列化的问题。直接对Entity对象进行序列化时,无论使用System.Text.Json还是NewtonSoft.Json,都会遇到问题。为了解决循环引用和子类属性丢失,推荐使用AutoMapper创建Dto对象并使用NewtonSoft.Json进行序列化。在反序列化过程中,需要自定义JsonConverter来根据字段实例化正确的子类。
摘要由CSDN通过智能技术生成

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对象除了懒加载生成的代理对象造成不

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值