DataContractJsonSerializer 的可选字段(如何更改默认值)
Optional fields with DataContractJsonSerializer (how to change the default)
我一直在使用 DataContractJsonSerializer
成功地将对象序列化为 json。这样做的好处是我可以使用可选字段(可以序列化也可以不序列化)。例如
[DataContract()]
public class aClass
{
[DataMember()]
public int member1;
[DataMember()]
public int member2;
[DataMember(EmitDefaultValue=false)]
public int member3;
}
在这种情况下,当我实例化class aClass
的对象时,我可以将member1设置为1,member 2设置为2,member3设置为3。当我序列化它时,我获取相应的 JSON 字符串。另一方面,如果我只设置 member1 和 member2,序列化器在生成 JSON 字符串时会忽略 member3。这非常有用,它不仅适用于整数,还适用于列表、对象等。
现在,我还没有尝试过,但我认为序列化程序不仅会在未设置时忽略 member3,而且在设置为默认值时也会忽略(在 int 情况下默认值为 0)。所以只要 member3 是 1 或 2 或 3,它就会被序列化。到目前为止,这是理想的行为。
我的问题来了。
我希望 member3 在设置为 0 或 1、2、3 时进行序列化。否则不进行序列化。 (例如未设置时)
这可能吗?如何实现?
我终于找到了一种方法来完成我的要求。
是的,起初我做了一个能够序列化 0 的 hack,但这是一个涉及保留其他变量的 hack (bool setTo0=false
),但后来我发现有一个更简单的方法。
它正在使用 Nullable Types。当您将 int 声明为可空类型时,即使设置为默认值 0,它也会对其进行序列化。唯一不会序列化的情况是最初设置为 null 时(是的,在这种情况下可以将 int 设置为 Null) .
我一直在使用 DataContractJsonSerializer
成功地将对象序列化为 json。这样做的好处是我可以使用可选字段(可以序列化也可以不序列化)。例如
[DataContract()]
public class aClass
{
[DataMember()]
public int member1;
[DataMember()]
public int member2;
[DataMember(EmitDefaultValue=false)]
public int member3;
}
在这种情况下,当我实例化class aClass
的对象时,我可以将member1设置为1,member 2设置为2,member3设置为3。当我序列化它时,我获取相应的 JSON 字符串。另一方面,如果我只设置 member1 和 member2,序列化器在生成 JSON 字符串时会忽略 member3。这非常有用,它不仅适用于整数,还适用于列表、对象等。
现在,我还没有尝试过,但我认为序列化程序不仅会在未设置时忽略 member3,而且在设置为默认值时也会忽略(在 int 情况下默认值为 0)。所以只要 member3 是 1 或 2 或 3,它就会被序列化。到目前为止,这是理想的行为。
我的问题来了。
我希望 member3 在设置为 0 或 1、2、3 时进行序列化。否则不进行序列化。 (例如未设置时)
这可能吗?如何实现?
我终于找到了一种方法来完成我的要求。
是的,起初我做了一个能够序列化 0 的 hack,但这是一个涉及保留其他变量的 hack (bool setTo0=false
),但后来我发现有一个更简单的方法。
它正在使用 Nullable Types。当您将 int 声明为可空类型时,即使设置为默认值 0,它也会对其进行序列化。唯一不会序列化的情况是最初设置为 null 时(是的,在这种情况下可以将 int 设置为 Null) .