我有以下业务对象
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类相同:我需要使用某个属性标记业务对象中的属性。
有一个术语“持久性无知”,这意味着业务对象不知道持久性。序列化是否相同?
答案 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 DataContract
和DataMember
属性在大多数情况下都可以使用,但不是全部。这种列表中的第一个例外是XmlSerializer
内置的.NET,如果没有自定义元素名称的XmlElement
属性,则无效。