我一直在成功使用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时进行序列化。否则不进行序列化。 (例如,未设置时)
这甚至可能吗?如何实现?
答案 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)。 。