重构静态类和方法(Json序列化/反序列化)

时间:2017-11-16 12:41:11

标签: c# json.net

我已经使用https://quicktype.io为我的Json数据创建了一个类。但是,我并不真正理解为什么使用从json转换为json创建的辅助方法,并提供默认参数,它们每个都以不同的方式创建,作为类的静态方法,静态类和带静态方法的类

原因是因为一旦我从另一组json数据创建第二个类,代码就会因为静态类而失败,我想确保我正确地重构它们。同时了解当然的原因。

我想'转换器'永远不会改变我所有的json对象,所以我可以将它移动到一个单独的文件和Serialize到一个静态方法使用FromJson。但我想更多地了解一下如何做到这一点的原因以及更好的方法。

以下是代码:

public partial class StationDO
{
    public string Active { get; set; }
    //more fields here
}

public partial class StationDO
    {
        public static List<StationDO> FromJson(string json)
        {
            return JsonConvert.DeserializeObject<List<StationDO>>(json, Converter.Settings);
        }
    }

    public static class Serialize
    {
        public static string ToJson(this List<StationDO> self)
        {
            return JsonConvert.SerializeObject(self, Converter.Settings);
        }
    }

    public class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
        };
    }

如果我查看同一网站生成的Java代码,它只会将bean的所有内容放入单个类中,并且转换器

1 个答案:

答案 0 :(得分:1)

您可以在StationDO课程中拥有所有静态成员。在这种情况下,我建议将该类标记为已密封(public sealed class StationDO),以防止某人从该类继承并使用继承类中的静态方法。

public class InheritedStationDO : StationDO { }
// ... somewhere else ...
InheritedStationDO.FromJson(jsonValue); // still returns List<StationDO> not List<InheritedStationDO> !!!

修改

仔细看后我觉得,整个成员的设计都不好。

1)没有必要只接受List<StationDO>

2)没有必要为每个类的(反)序列化定义特殊方法,你将拥有。您可以只使用一种序列化方法,也可以使用一种方法对所有类进行反序列化。

示例:

public class StationDO {
    public string Active { get; set; }
}

public class AnotherDO {
    public string Name { get; set; }
}

// and more *DO classes

// class need to be "static" because contains "extension methods"
public static class MySerializationHelper {
    private static readonly JsonSerializerSettings serializationSettings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
        };

    // universal method for deserialization from json
    // the generic type "T" represents the result type of deserialization
    public static T FromJson<T>(string json) {
        return JsonConvert.DeserializeObject<T>(json, serializationSettings);
    }

    // universal method for serialization to json
    // this "this" keyword means, its "extension method"
    public static string ToJson<T>(this T self) {
        return JsonConvert.SerializeObject(self, serializationSettings);
    }
}

<强>用法:

StationDO obj01 = GetSomeStation();

// returns json of one object
string json01A = obj01.ToJson(); // these two lines are equivalent
string json01B = MySerializationHelper.ToJson(obj01); // these two lines are equivalent

// returns new object deserialized from json in "json01" variable
StationDO clone01 = MySerializationHelper.FromJson<StationDO>(json01A);

StationDO obj02 = GetAnotherStation();
StationDO[] arr01 = new StationDO[] { obj01, obj02 };

// returns json of array with two objects
string json02A = arr01.ToJson(); // these two lines are equivalent
string json02B = MySerializationHelper.ToJson(arr01); // these two lines are equivalent

// returns new array with deserialized object from json in "json02" variable
StationdDO[] clone02 = MySerializationHelper.FromJson<StationdDO[]>(json02A);

AnotherDO obj03 = GetAnotherDO();
string json03A = obj03.ToJson(); // these two lines are equivalent
string json03B = MySerializationHelper.ToJson(obj03); // these two lines are equivalent

如您所见,泛型是如何避免每个类的代码重复的方式。 您可以(de)序列化所有类型的数组和集合或单个对象。不只是List<T>