【问题标题】:JSON.net null propertyJSON.net 空属性
【发布时间】:2014-06-18 22:00:24
【问题描述】:

我最近解决了这个错误: Type is an interface or abstract class and cannot be instantiated, 通过使用此处建议的解决方案: Using Json.NET converters to deserialize properties.

不幸的是,我遇到了新的问题。在下面的代码中,Depth 作为反序列化的一部分被调用,反序列化又调用 Prof 属性,该属性失败,因为 'this.Profile' 为空。 ('this.Profile' 是继承自 Section 类的属性。)

public class TimberSection : Section, IPurlinShape, IEavesBeamShape
    {
        private Profiles.Flat Prof
        {
            get
            {
                var prof = this.Profile as Profiles.Flat;
                if (prof != null)
                    return prof;
                else
                    throw new DataMissingException("Expected Rectangle profile");
            }
        }

        public override double Depth { get { return Prof.Depth; } }
}

我使用http://www.jsoneditoronline.org/ 查看我的对象,似乎一切都正确。当我反序列化时出现 null 的配置文件对象的值与序列化之前的对象相同。

下面是我序列化它的方法,然后立即反序列化它。

        string serialisedEnquiry = JsonConvert.SerializeObject(enquiry, Formatting.Indented, new JsonSerializerSettings
         {
             TypeNameHandling = TypeNameHandling.Objects,
             TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
         });

        Enquiry enq = JsonConvert.DeserializeObject<Enquiry>(serialisedEnquiry, new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.Objects
        });

我在这里做错了什么?

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    我脑海中浮现的两件事是

    • Depth 从属性更改为方法

    • 制作整个类 opt-in 并指定应该序列化的属性

    你可以阅读更多关于here

    【讨论】:

    • 感谢您的回复。我是否正确地说您的建议是排除无论如何不保存数据并通过调用可能尚未反序列化的对象而导致问题的代码?问题在于项目的大小 - 仅对 Depth 的引用就有 150 个,而对我的配置文件对象的其他部分的引用要多得多。有没有办法让它在不实际调用它的情况下构造对象?我不明白为什么在完全反序列化之前调用 getter。
    • 我并不是说要排除代码。我是说告诉 json.net 应该序列化哪些属性。 getter 在完全反序列化后永远不会被调用,因为反序列化会调用所有的 getter。我不确定你序列化后的意图是什么,但如果你不需要depth,就不要序列化它。
    • 即使我不解析 depth 属性,当我将其反序列化回对象时仍然会调用它。为什么在给定 profile 值之前调用它?我想这是我真正的问题。除非配置文件对象没有正确反序列化,而且我首先知道的是当其他东西试图使用它时。
    • "当我将它反序列化回一个对象时它仍然被调用"不,它没有,没有设置器。
    • 对不起,我的意思是一些东西(实际上很多东西)正在运行它。当它通过从尚不存在的对象返回值来响应时,它会失败。您说得对,通过引用其他值获得的所有值都不需要解析。但是,我不会想到我必须手动将它们全部取出。 “反序列化调用所有的吸气剂” - 在主对象的每个子对象都被反序列化之后,这不应该发生吗?如果是这样,也许我还有另一个问题。
    【解决方案2】:

    ObjectCreationHandling = ObjectCreationHandling.Replace 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2012-07-25
      • 1970-01-01
      • 2011-04-06
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多