DataContractJsonSerializerを利用する際の注意
About
JSONを利用した通信を行う場合、外部のライブラリなどに頼らず最も簡単にJSONテキストを生成する方法は、DataControctJsonSerializerを利用することです。しかしながら、DataContractJsonSerializerには問題があります。それはJSONテキストにシリアライズするオブジェクトのdouble(float)型の値が整数である場合に、出力に小数点が与えられない、という問題です。つまり"10.0f"という値は、出力時に"10"というJSONテキストになります。
private static DataContractJsonSerializer EditDataJSONSerializer = new DataContractJsonSerializer(typeof(SampleData)); … //標準シリアライザーを利用すると整数値の場合に小数点が無視される. EditDataJSONSerializer.WriteObject(memoryStream, sampleData); byte[] temp = memoryStream.ToArray(); memoryStream.Dispose(); string jsontext = Encoding.ASCII.GetString(temp));
Why
先に紹介した仕様がどういった場合に問題に繋がるかというと、受け取り側でデコードないしデシリアライズする際に問題を引き起こす可能性があります。JSONから与えられる値をdouble値として処理する必要があるにもかかわらず、intの値として処理してしまう可能性があるのです。JSONを利用して通信する場合には、受け取り手は必ずしもDataContractJsonSerializerと同等の機能を有していないでしょう。受け取り側が、自動的に型を推測して任意のオブジェクト(のインスタンス)にデシリアライズするような処理を実行する場合に、エラーを引き起こしかねません。