【问题标题】:C# How to serialize an object in different waysC#如何以不同的方式序列化一个对象
【发布时间】:2017-06-28 10:15:04
【问题描述】:

假设我有一个我希望能够序列化的类,如下所示:

public class SomeClass
{
    [DataMember]
    public object Var1 {get; set; }

    [DataMember]
    public object Var2 {get; set; }

    [DataMember]
    public object Var3 {get; set; }
}

有时我希望它在省略 Var3 的情况下进行序列化,所以基本上是这样的:

public class SomeClass
{
    [DataMember]
    public object Var1 {get; set; }

    [DataMember]
    public object Var2 {get; set; }

    public object Var3 {get; set; }
}

在其他情况下,我希望省略 Var2。

有什么方法可以用属性来装饰类,使我能够选择我希望这个类以何种方式序列化?

【问题讨论】:

标签: c# serialization datacontractserializer


【解决方案1】:

在属性中添加EmitDefaultValue参数。

public class SomeClass
{
    [DataMember]
    public string Var1 { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public object Var2 { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public object Var3 { get; set; }
}

当您想省略 Var2 时,请将其设置为 null

SomeClass sc = ...;
sc.Var2 = null;

结果会被省略。

【讨论】:

  • 这在我的情况下可能确实有效。我会试试看!
【解决方案2】:

如果你使用 JSON.NET 进行序列化,你可以使用Conditional Property Serialization

要有条件地序列化一个属性,添加一个返回的方法 与属性同名的布尔值,然后为方法添加前缀 名称与 ShouldSerialize。方法的结果决定是否 该属性已序列化。如果该方法返回 true,则 属性将被序列化,如果它返回 false 则该属性 将被跳过。

例子

public class SomeClass
{
    [DataMember]
    public object Var1 {get; set; }

    [DataMember]
    public object Var2 {get; set; }

    [DataMember]
    public object Var3 {get; set; }

    public bool SerializeVar2 {get; set; }

    public bool ShouldSerializeVar2
    {
        return SerializeVar2;
    }
}

【讨论】:

  • 不幸的是,我不适合使用 Json.NET
  • 那么什么是序列化程序?因为解决方案依赖于序列化器,所以没有一种通用的方法。
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多