C# 如何使业务对象序列化?
C# 如何使业务对象序列化?,c#,json,xml,serialization,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序列化的接口和实现 i
我有以下业务对象
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);
}
}
接口序列化程序
{
字符串序列化(T obj);
}
类NewtonJsonSerialization:IJSONSerializer
{
公共字符串序列化(T obj)
{
返回JsonConvert.Serialized对象(obj,Formatting.Indented);
}
}
这是我的客户代码
var Employee = new Employee();
Employee.FirstName = "Ihor";
Employee.Lastname = "fff";
IJSONSerializer<Employee> serailizer = new NewtonJsonSerialization<Employee>();
var result = serailizer.Serialize(Employee);
var Employee=新员工();
Employee.FirstName=“Ihor”;
Employee.Lastname=“fff”;
IJSONSerializer serailizer=新的NewtonJsonSerialization();
var result=serailizer.Serialize(雇员);
这里我不喜欢的是——该员工知道它将被序列化为某个特定的库(因为JsonProperty属性)。因此,如果我决定使用另一个json序列化程序或编写自己的json序列化程序,我将需要遍历所有业务对象并修改它们。是否可以使我的业务对象序列化?如果是,怎么做
XML序列化和类也是如此:我需要在业务对象中用一些属性标记属性
有一个术语“持久性无知”,它意味着业务对象不知道持久性。序列化也一样吗 大多数序列化程序都使用.Net的DataContract属性。Json.net也是如此。并确保查看MSDN以了解如何影响序列化。大多数序列化程序都使用.Net的DataContract属性。Json.net也是如此。并确保查看MSDN以了解如何影响序列化。除非您需要序列化的键/元素名称与C#类上定义的不同,否则您根本不应该担心属性。JSON和XML都可以很好地工作,无需使用序列化特定的属性来修饰类属性 如果在序列化数据中确实需要自定义键/元素名称,那么必须用多个属性装饰类道具。任何序列化程序都只读取相关属性并忽略rest
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>
*/
ISerializer序列化程序;
字符串结果;
var person=新的人{FirstName=“Nikhil”};
serializer=新的NewtonsoftJsonSerializer();
结果=序列化程序。序列化(个人);
/*输出
{“名字”:“Nikhil”}
*/
serializer=新的内置XmlSerializer();
结果=序列化程序。序列化(个人);
/*输出
尼基尔
*/
编辑:
根据@Michael Nero
DataContract
和DataMember
的说法,属性在大多数情况下都有效,但并非所有情况下都有效。此类列表中的第一个例外是.NET内置的XmlSerializer
,如果自定义元素名没有XmlElement
属性,它就无法工作。除非您需要序列化的键/元素名与C#类上定义的不同,否则您根本不应该担心属性。JSON和XML都可以很好地工作,无需使用序列化特定的属性来修饰类属性
如果在序列化数据中确实需要自定义键/元素名称,那么必须用多个属性装饰类道具。任何序列化程序都只读取相关属性并忽略rest
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>
*/
ISerializer序列化程序;
字符串结果;
var person=新的人{FirstName=“Nikhil”};
serializer=新的NewtonsoftJsonSerializer();
结果=序列化程序。序列化(个人);
/*输出
{“名字”:“Nikhil”}
*/
serializer=新的内置XmlSerializer();
结果=序列化程序。序列化(个人);
/*输出
尼基尔
*/
编辑:
根据@Michael Nero
DataContract
和DataMember
的说法,属性在大多数情况下都有效,但并非所有情况下都有效。此类列表中的第一个例外是.NET内置的XmlSerializer
,如果自定义元素名没有XmlElement
属性,它将无法工作。将属性设置为私有。将属性设置为私有。因此,如果我决定使用另一个json序列化程序或编写自己的json序列化程序,我将需要检查所有业务对象并修改它们。是否可以使我的业务对象序列化?请参阅上面的编辑。忘了其他的吧,如果您想使用XML,那么您必须修改它以获得自定义元素名。如果您可以使用与类道具同名的键/元素,则不必在类中进行任何更改或使用属性。所以,如果我决定使用另一个json序列化程序或编写自己的json序列化程序,我将需要遍历所有业务对象并修改它们。是否可以使我的业务对象序列化?请参阅上面的编辑。忘了其他的吧,如果您想使用XML,那么您必须修改它以获得自定义元素名。如果您可以使用与类道具同名的键/元素,则不必在类中进行任何更改或使用属性。您的选择。让我们想象一下我将使用DataContract属性。如果我要编写自己的json序列化程序或使用JavaScriptSerializer,我仍然需要遍历所有业务对象并删除不必要的属性。当然,可能。然而,这个问题是否存在?我想请你们退一步,问问今天解决这个问题是否有助于为利益相关者提供价值。如果您可以合理地确定在满足可交付日期时不必支持序列化程序“X”,那么我建议您从这个问题开始。我们软件开发人员很聪明,但即使是我们也无法预测未来啊,如果您最终编写了自己的序列化程序,请确保支持DataContract,为了我和所有使用DataContract的人!实际上这是一个小理论问题。。。目前这个问题还不存在。我非常确定我们不会更改当前的json序列化程序。但本质上我很好奇,我问自己“如果我们改变它怎么办……”。我明白了