4

私は以下のようなクラスを持っています

[Serializable]
public class sample
{
    private int m_width;
    private int m_height;
    public int Width
    {
        get
        {
            return this.m_width;
        }
        set
        {
            this.m_width = value;
        }
    }

    public int Height
    {

        get
        {
            return this.m_height;
        }
        set
        {
            this.m_height = value;
        }
    }
}

DataContractJsonSerializerこのクラスのオブジェクトをシリアル化するために使用すると、次のようなjson文字列が得られます。

{"m_height":1345,"m_width":1234}

Newtonsoft.Json.dll を使用してこれをシリアル化すると、次のような出力が得られます。

{"Width":1234,"Height":1345}

クラスがシリアライズ可能とマークされている場合、DataContractSerializer がシリアライゼーションにバッキング フィールドを使用するのはなぜですか?

を使用して同じことを達成する方法はありますかNewtonsoft.Json.dll

4

5 に答える 5

2

[Serializable]従来の方法を使用してシリアル化できるようにマークされているオブジェクトがいくつかありますが、Web API で使用するために JSON できれいにシリアル化する必要があります。に設定IgnoreSerializableAttributeするtrueと、Newtonsoft.Json が Microsoft のシリアライザーのように動作するのを停止し、代わりにパブリック プロパティをシリアル化します。

TLDR: これを WebApiConfig.cs に追加します。

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
于 2016-04-28T08:15:15.610 に答える
1

WCF から WCF へ常に通信している場合を除き、最善の策はおそらく Newtonsoft シリアライザーを使用することです。残念ながら、MS シリアライザーは、多くの Web アプリが期待する標準と一致しないいくつかの Microsoft 固有の標準に従っているようです。

Newtonsoft のシリアライザーはより標準的なようで、MS でさえ WebAPI や Web API http クライアントで使用しています (nuget がプル ダウンします)。

もう 1 つの違いがあります。DateTime 型をシリアル化してみてください。DataContract シリアライザーは、他の JSON と互換性のない別の形式で値をシリアル化することがわかります (スラッシュが含まれていることに気付くでしょう)。私の理解では、その代替形式は一部の AJAX WebForm コントロールで使用されていましたが、これは Microsoft Webforms に固有のものです。

日付に関する詳細情報は次のとおりです: http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

于 2013-08-19T13:41:50.440 に答える
1

Newtonsoft.Json.dll の DefaultContractResolver クラス IgnoreSerializableAttribute プロパティを true に設定しているコードが見つかりました。

#if !(SILVERLIGHT || NETFX_CORE || PORTABLE || PORTABLE40)
    IgnoreSerializableAttribute = true;
#endif

DotNet4.0 dll を使用しているため、このプロパティは true に設定され、Serializable 属性は無視されます。false にすると、DataContractSerializer と同じ出力が得られます

于 2013-08-20T07:15:41.877 に答える
1

ここにあなたが見るかもしれない別のことがあります:

DataContractJsonSerializer と Newtonsoft の違いは依然として残っていますが、奇妙なシリアライゼーション動作が発生する理由については、シリアライゼーション標準が混在しています。

[Serializable] 属性は、古い .Net シリアル化に関連しています。DataContractSerialization は下位互換性がありますが、動作は異なる場合があります。

これを datacontract の方法で行う場合は、代わりに [DataContract] 属性でクラスをマークし、シリアル化する各パブリック メンバーを [DataMember] 属性でマークします。(または、すべてのシリアライゼーション属性を削除し、すべてのパブリック プロパティにデフォルト設定する必要があります)

これで違いが説明できるはずですが、それでも Newtonsoft シリアライザを使用することをお勧めします。

于 2013-08-19T14:31:33.217 に答える