如何使业务对象序列化无知?

时间:2016-07-08 11:04:52

标签: c# json xml serialization


我有以下业务对象

public class Employee
{
   [JsonProperty("first_name")]
   public string FirstName { get; set; }
   public string Lastname { get; set; }
   public DateTime DateOfBirth { get; set; }
   public uint Salary { get; set; }
}

我有以下json序列化的接口和实现

 interface IJSONSerializer<T>
 {
   string Serialize(T obj);
 }

  class NewtonJsonSerialization<T> : IJSONSerializer<T>
 {
   public string Serialize(T obj)
   {
     return JsonConvert.SerializeObject(obj, Formatting.Indented);
   }
 }

这是我的客户代码

 var Employee = new Employee();
  Employee.FirstName = "Ihor";
  Employee.Lastname = "fff";
  IJSONSerializer<Employee> serailizer = new NewtonJsonSerialization<Employee>();
  var result = serailizer.Serialize(Employee);

我不喜欢这里 - 员工知道它会被一些特定的库序列化(因为 JsonProperty 属性)。因此,如果我决定使用另一个json序列化程序或自己编写,我将需要浏览所有业务对象并进行修改。是否有可能使我的业务对象序列化无知?如果有,怎么样?
与XML序列化和XmlSerializer类相同:我需要使用某个属性标记业务对象中的属性。

有一个术语“持久性无知”,这意味着业务对象不知道持久性。序列化是否相同?

2 个答案:

答案 0 :(得分:2)

大多数序列化程序都使用.Net的DataContract属性。 Json.net也是如此。 Try this sample out并确保在MSDN上查找the documentation for DataMember以了解如何影响序列化。

答案 1 :(得分:1)

除非您需要序列化的键/元素名称与C#类中定义的不同,否则您根本不必担心属性。 JSON和XML都可以正常工作,而无需使用序列化特定属性来修饰类属性。

如果您确实需要序列化数据中的自定义键/元素名称,则必须使用多个属性修饰类道具。任何序列化程序都只会读取相关属性并忽略休息。

public class Person
{
    [JsonProperty("first_name")]
    [XmlElement("first_name")]
    public string FirstName { get; set; }
}

致电代码

ISerializer<Person> serializer;
string result;

var person = new Person { FirstName = "Nikhil" };

serializer = new NewtonsoftJsonSerializer<Person>();
result = serializer.Serialize(person);
/*  Output 
    {"first_name":"Nikhil"}
*/

serializer = new BuiltInXmlSerializer<Person>();
result = serializer.Serialize(person);
/*  Output
    <Person 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <first_name>Nikhil</first_name>
    </Person>
*/

修改

根据@Michael Nero DataContractDataMember属性在大多数情况下都可以使用,但不是全部。这种列表中的第一个例外是XmlSerializer内置的.NET,如果没有自定义元素名称的XmlElement属性,则无效。