DataContractJsonSerializer的可选字段(如何更改默认值)

时间:2018-09-11 07:39:04

标签: c# json datacontractjsonserializer

我一直在成功使用DataContractJsonSerializer将对象序列化为json。很棒的事情是我可以使用可选字段(可以序列化也可以不序列化)。例如

[DataContract()]
public class aClass
{
  [DataMember()]
  public int member1;
  [DataMember()]
  public int member2;
  [DataMember(EmitDefaultValue=false)]
  public int member3;
}

在这种情况下,当我实例化类aClass的对象时,可以将member1设置为1,将member 2设置为2,将member3设置为3。当我对其进行序列化时,将获得相应的JSON字符串。另一方面,如果我仅设置member1和member2,则序列化程序在生成JSON字符串时会忽略member3。这非常有用,它不仅适用于int,而且适用于列表,对象等。

现在,我还没有尝试过,但是我认为序列化程序不仅会忽略member3,而且会在设置为默认值时将其忽略(在int情况下,默认值为0)。因此,只要member3是1或2或3,它就会被序列化。到目前为止,这是理想的行为。

这是我的问题。

我希望将member3设置为 0 或1、2、3时进行序列化。否则不进行序列化。 (例如,未设置时)

这甚至可能吗?如何实现?

1 个答案:

答案 0 :(得分:0)

我终于找到了一种方法来完成我所要求的。 是的,起初我做了一个可序列化0的黑客,但这是涉及保留其他变量( //The fragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProviders.of(this).get(OverviewFragmentViewModel::class.java) allSubscriptions.add(viewModel.uiStateChanged .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ uiState -> when (uiState) { is UiState.Loading -> showLoadingView() is UiState.ListReady -> showList(uiState) is UiState.Error -> showErrorView() } }, { error -> Log.e(TAG, error.message, error) }) )} } override fun onStart() { super.onStart() viewModel.loadMovies() } //The ViewModel class OverviewFragmentViewModel : ViewModel(){ val uiStateChanged = PublishSubject.create<UiState>() val model = OverviewFragmentRepo() companion object { val TAG = OverviewFragmentViewModel::class.java.simpleName } override fun onCleared() { super.onCleared() } fun loadMovies(){ //This is the emission that happens to fast for the fragment to receive it! uiStateChanged.onNext(UiState.Loading()) model.getMovies() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({response -> uiStateChanged.onNext(UiState.ListReady(response.results)) }, { error -> uiStateChanged.onNext(UiState.Error()) Log.e(TAG, error.message, error) }) } } )的黑客,但后来我发现有一种更简单的方法。

它正在使用Nullable Types。当您将int声明为可为null的类型时,即使将其设置为默认值0,它也将对其进行序列化。唯一不会对其进行序列化的是原始设置为null的情况(是的,在这种情况下,可以将int设置为Null)。 。

相关问题