2016-08-07 10 views
1
私は次のクラスを持ってい

で定数をシリアル:C#が - DataContractJsonSerializer

[DataContract] 
class ExampleClass 
{ 
    //Properties 
    [DataMember(Name = "method")] 
    private const string method = "Example Constant"; 
    ... 
    ... 

DataContractJsonSerializerは、JSON出力で一定の「方法」が含まれていないように見えます。

どのようにメンバを定数に保ち、クラスでそれを直列化できますか?

ありがとうございます。

+2

プライベートではなく定数をパブリックにすると、それでも失敗しますか?しかしもう一つの問題は、定数の値 - これは定数ISとは関係がありません - イニシャライザのどこにでも設定できないということかもしれません。 –

+3

私は本当にあなたがそれをすることができるとは思わない。 1つは、それをシリアル化している可能性がありますが、それを逆シリアル化することは不可能です。 [DTO](https://en.wikipedia.org/wiki/Data_transfer_object)には、ゲッタとセッタが含まれている必要があります。 'const'にはセッターがありません。 – Michael

+0

@EdPlunkettはい、パブリックであっても定数をシリアル化しません。 "const"を削除すると、シリアル化されます。さらに、非定数のプライベートメンバーに対してもシリアル化が機能します。 – Taru

答えて

4

:また

[DataContract] 
class ExampleClass 
{ 
    public ExampleClass() 
    { 
     method = "Example Constant"; 
    } 

    [DataMember(Name = "method")] 
    private string method; 

は、プロパティを使用することができますJSON出力のconstは、privateとしてアクセスできません。しかし、constをシリアライズすることは意味を持ちません。constは静的メンバーであり、特定のインスタンスではなくクラス自体に属しています。そのため、シリアライザはそのインスタンスに設定することはできません。契約シリアライザに精通

[DataContract] 
class ExampleClass 
{ 
    private const string method = "Example Constant"; 

    //Properties 
    [DataMember(Name = "method")] 
    public string Method { get; set; } 

    public ExampleClass(this.Method = method; } 
} 

PS: - 私ではないが、これは、XML-シリアライザとどうなるのかです:

は、あなたがプロパティであなたの定数を包むことがこれを言いました。おそらく契約書を持っている人は、取得専用のプロパティを持つこともできるので、余分なコンストラクタは必要ありませんが、これについてはわかりません。

0

定数は通常の変数に似ています。唯一の違いは、コンパイル時の値で置き換えられることです。

JSONはデータを転送するための形式なので、定数について特別なことを行う理由はありません。しかし、クラス名や列挙型のような特殊な型の場合には、その名前の意味が異なるため、JSONに追加のプロパティがあります。

2

constは、.NETの特別なキーワードです。 fieldを定数として指定すると、コンパイルされたコードには存在しませんが、constantのすべての参照はコンパイル時にconstantの値に置き換えられます。したがって、この定数はコンパイルされたコードには存在しないため、シリアル化されていません。

それを修正する最も簡単な方法は、通常のフィールド(またはプロパティ)に定数変更することで、コンストラクタで値を割り当てますため

[DataMember(Name = "method")] 
    private string Method { get; set; } 
+0

"しかし、定数のすべての参照は、コンパイル時に定数の値で置き換えられます。 – HimBromBeere

関連する問題