为何序列化后的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
相关产品推荐
相关产品推荐

