Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使业务对象序列化?_C#_Json_Xml_Serialization - Fatal编程技术网

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序列化程序。但本质上我很好奇,我问自己“如果我们改变它怎么办……”。我明白了