Skip to content

设置异常行为

陈鑫伟 edited this page Jul 23, 2019 · 5 revisions

此例演示设置当属性不含 get/set 方法时读取或设置该属性不引发异常。

    public class Demo
    {
        public int Id { get; }

        public string Name { get; }

        public static void Main()
        {
            // 默认情况下,当属性不含 get/set 方法时读取或设置该属性将引发 MemberAccessException 异常。
            // 此配置设置此情况不引发异常而是跳过设置或取得 Null 值。
            // 注意:[RWObject] 特性同样可以设置此配置。
            FastObjectRW.DefaultOptions &= ~FastObjectRWOptions.CannotSetException;

            var json = JsonFormatter.SerializeObject(new { Id = 1, Name = "Dogwei" });
            
            var obj = JsonFormatter.DeserializeObject<Demo>(json);

            json = JsonFormatter.SerializeObject(obj);

            Console.WriteLine(json);
            // {"Id":0,"Name":null}
        }
    }

FastObjectRWOptions 有下例几个有关异常的配置。与 [RWObject] 特性的参数同名。

FastObjectRWOptions.CannotGetException // 当读取的属性或字段不能读取时将引发异常,这是默认行为。
FastObjectRWOptions.CannotSetException // 当写入的属性或字段不能写入时将引发异常,这是默认行为。
FastObjectRWOptions.NotFoundException // 当读取或写入的属性或字段不存在时将引发异常,这是默认行为。

此例演示设置 Json 超出最大深度异常。

    public class Demo
    {
        public object Me => this;

        public static void Main()
        {
            // 默认情况下,当 Json 结构超出 MaxDepth 定义的深度时不引发异常,且不序列化超出部分。
            // 此配置设置此情况将引发异常。
            var jsonFormatter = new JsonFormatter(JsonFormatterOptions.OutOfDepthException);

            var obj = new Demo();
            
            var json = jsonFormatter.Serialize(obj);
            // JsonOutOfDepthException: Json struct depth out of the max depth.
        }
    }

JsonFormatterOptions 有下例几个有关异常的配置。

JsonFormatterOptions.LoopReferencingException// 序列化时出现循环引用的字段将引发异常,这默认时关闭的。
JsonFormatterOptions.OutOfDepthException// 序列化时超出结构深度时将引发异常,这默认是关闭的。