C# 如何以不同的方式序列化一个对象

C# How to serialize an object in different ways

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

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。

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

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

To conditionally serialize a property, add a method that returns boolean with the same name as the property and then prefix the method name with ShouldSerialize. The result of the method determines whether the property is serialized. If the method returns true then the property will be serialized, if it returns false then the property will be skipped.

示例

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;
    }
}

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;

结果它将被省略。