当前位置: 首页 > 知识库问答 >
问题:

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

易书
2023-03-14


我有以下业务对象

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个答案

颛孙国源
2023-03-14

除非您需要序列化的键/元素名称与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 ,< code > data contract 和< code>DataMember属性将在大多数情况下起作用,但不是所有情况。这个列表中的第一个例外是。NET的内置< code>XmlSerializer在没有自定义元素名称的< code>XmlElement属性的情况下无法工作。

霍浩皛
2023-03-14

大多数序列化程序利用。Net的DataContract属性。Json.net也一样。试用这个示例,并确保在MSDN上查找DataMember的文档,以了解如何影响序列化。

 类似资料:
  • null 但是,当我以Yar-Client模式提交Spark应用程序时,抛出了以下异常: 线程“main”org.apache.spark.sparkException:Task not serializable at org.apache.spark.util.closureCleaner$.ensureRecleaner.ccala:166)at org.apache.spark.util.c

  • 我有一个webfluxendpoint,它返回一个项目数组。我试图让它将对象名添加到由@JsonRootName指定的数组中的每个项中。我曾经尝试过使用Jackson2ObjectMaper这样配置对象映射器。我正在使用SpringBoot 2.4.4。 我的endpoint如下所示: Json的回应是: 预期输出: 然而,当我的对象被@JsonRootName注释时,我没有得到根对象 欢迎提出任

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co

  • 嗨,我有LogEventObject在客户端用于记录事件,我想使用REST API将其发送到服务器。我将LogEventObject转换为json字符串,并通过REST将其作为有效载荷发送。在服务器端,我使用Groovy,当我尝试做对象apper.read值()时,我得到以下错误。 com.fasterxml.jackson.databind.JsonMappingExc0019:找不到非具体的集

  • (数据类)实体。JAVA (数据类)实体。JAVA 我试着说: 我犯了一个错误: 我已经把和我错过了什么?

  • 问题内容: 我需要将一些对象序列化为JSON并发送到WebService。如何使用org.json库?否则我将不得不使用另一个?这是我需要序列化的类: 我只放了类的变量和构造函数,但也有getter和setter方法。所以如果有人可以帮忙 问题答案: 没有注释的简单方法是使用Gson库 就那么简单: