You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何序列化后的gridTradingState对象无法反序列化?

反序列化失败原因排查及解决办法

核心原因分析

你的gridTradingState类反序列化后为空,主要是以下几点导致:

  • 只读属性无法被赋值:所有属性都声明为ReadOnly Property,仅包含公共get访问器,没有set访问器。Newtonsoft.Json反序列化时需要设置属性值,只读属性不支持写入操作,因此无法完成赋值。
  • 私有后备字段未被Json序列化器识别:类中通过私有字段(如_bidInBase)存储数据,但默认情况下Newtonsoft.Json不会处理私有成员,无法将JSON中的值映射到这些私有字段。
  • 缺少适配反序列化的构造逻辑:虽然有静态工厂方法创建实例,但Newtonsoft.Json默认使用无参构造函数生成对象后,没有合适的方式将JSON数据注入到对象中。

具体解决办法

办法1:为只读属性添加私有setter

修改属性定义,保留只读特性的同时添加私有setter,让Newtonsoft.Json可以通过反射写入值:

Class gridTradingState
    Private _bidInBase As Decimal
    Private _askInBase As Decimal
    ' 其他私有字段...

    Property bidInBase As Decimal
        Get
            Return _bidInBase
        End Get
        Private Set(value As Decimal)
            _bidInBase = value
        End Set
    End Property

    Property askInBase As Decimal
        Get
            Return _askInBase
        End Get
        Private Set(value As Decimal)
            _askInBase = value
        End Set
    End Property

    ' 其他属性同理修改...

    ' 原有方法保持不变
End Class

办法2:为私有字段添加JsonProperty特性

直接标记私有后备字段为可序列化,让Json转换器直接操作这些字段:

Class gridTradingState
    <JsonProperty>
    Private _bidInBase As Decimal
    <JsonProperty>
    Private _askInBase As Decimal
    <JsonProperty>
    Private _high As Decimal
    <JsonProperty>
    Private _low As Decimal
    <JsonProperty>
    Private _dateSinceLastTransactions As Date
    <JsonProperty>
    Private _suggestedLow As Decimal
    <JsonProperty>
    Private _suggestedhigh As Decimal
    <JsonProperty>
    Private _Orders As OrderAlreadyPlacedAtanExchange()

    ' 原有只读属性和方法保持不变
End Class

办法3:添加标记JsonConstructor的构造函数

创建带参数的私有构造函数,并用JsonConstructor特性标记,让Newtonsoft.Json通过该构造函数初始化对象:

Class gridTradingState
    ' 原有私有字段和只读属性...

    <JsonConstructor>
    Private Sub New(bidInBase As Decimal, askInBase As Decimal, high As Decimal, low As Decimal, dateSinceLastTransactions As Date, suggestedLow As Decimal, suggestedhigh As Decimal, Orders As OrderAlreadyPlacedAtanExchange())
        _bidInBase = bidInBase
        _askInBase = askInBase
        _high = high
        _low = low
        _dateSinceLastTransactions = dateSinceLastTransactions
        _suggestedLow = suggestedLow
        _suggestedhigh = suggestedhigh
        _Orders = Orders
    End Sub

    ' 原有静态工厂方法和update方法保持不变
End Class

内容的提问来源于stack exchange,提问作者user4951

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:01:43