【问题标题】:C# - Serialize Constants with DataContractJsonSerializerC# - 使用 DataContractJsonSerializer 序列化常量
【发布时间】:2016-08-07 15:45:20
【问题描述】:

我正在上以下课程:

[DataContract]
class ExampleClass
{
    //Properties
    [DataMember(Name = "method")]
    private const string method = "Example Constant"; 
    ...
    ...

DataContractJsonSerializer 似乎没有在 JSON 输出中包含常量“方法”。

如何保持成员不变,并让类序列化它?

谢谢。

【问题讨论】:

  • 如果您将常量设为公开而不是私有,它仍然会失败吗?不过,另一个麻烦可能是常量的值——这与常量 IS 有关——除了在初始化程序中之外,不能真正设置在任何地方。
  • 我真的认为你做不到。一件事是序列化,这也许可以做到,但反序列化是不可能的。 DTO 应该包含 getter 和 setter。 const 没有二传手。
  • @EdPlunkett 是的,即使它是公共的,它仍然不会序列化常量。如果我删除“const”,它会被序列化。此外,序列化适用于非常量私有成员。

标签: c# .net json serialization


【解决方案1】:

对于 JSON 输出,const 根本无法访问,因为它是 private。然而,序列化 const 完全没有意义,因为 const 是静态成员,属于类本身,而不是特定实例。因此,序列化程序无法在实例上设置它,因为该实例上没有任何设置。

话虽如此,您可以将常量包装在属性中:

[DataContract]
class ExampleClass
{
    private const string method = "Example Constant"; 

    //Properties
    [DataMember(Name = "method")]
    public string Method { get; set; }

    public ExampleClass(this.Method = method; }
}

PS.:我不熟悉合同序列化器,但这就是你对 Xml 序列化器所做的事情。也许使用 contract-ser 你也可以拥有一个 get-only 属性,因此你不需要额外的构造函数,但我不确定这一点。

【讨论】:

    【解决方案2】:

    const 是 .NET 中的一个特殊关键字。如果将字段指定为常量,则编译代码中将不存在该字段,但在编译时所有常量的引用都将替换为常量的值。因此,该常量在编译后的代码中不存在,因此它也没有被序列化。

    修复它的最简单方法是将常量更改为常规字段(或属性)并在构造函数中分配值:

    [DataContract]
    class ExampleClass
    {
        public ExampleClass()
        {
            method =  "Example Constant"; 
        }
    
        [DataMember(Name = "method")]
        private string method;
    

    或者,您可以使用属性:

        [DataMember(Name = "method")]
        private string Method { get; set; }
    

    【讨论】:

    • "但是所有对常量的引用都会在编译时被常量的值替换"很高兴知道...
    【解决方案3】:

    常量就像普通变量。唯一的区别是它们将替换为编译时的值。

    JSON 是一种用于传输数据的格式,因此它没有任何理由对常量进行特殊处理。但是,如果您有特殊类型,例如类甚至枚举,其中名称的含义会有所不同,那么 JSON 中将会有其他属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多