2012-02-21 5 views
6

APIメソッドを標準のMVCアクションから新しいasp.net Web-APIベータに移行しました。突然読み取り専用プロパティがシリアル化されなくなりました(どちらもJSONを返します)。これは予想される動作ですか?ASP.NET Web-APIが読み取り専用プロパティをシリアル化していません

編集:追加のサンプルコード

私はNewtonsoft.Json 4.0.8とSystem.Json nugetパッケージを介して参照4.0

 public IQueryable<Car> Gets() 
     { 
      return _carRepository.GetCars(); 
     } 

     public class Car 
     { 
      public IEnumerable<Photo> Photos 
      { 
       get { return _photos; } 
      } 

      public string PreviewImageUrl // No longer serialized 
      { 
       get 
       { 
        var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault(); 
         return mainImage != null ? mainImage.Url : (string.Empty); 
        } 
       } 
      } 
     } 
+0

期待できません。問題を再現するコードを投稿することはできますか? – marcind

+0

あなたはどのJSONシリアライザを使用していますか? –

答えて

10

ベータ版に同梱されているJsonMediaTypeFormatterは、読み取り専用のプロパティをサポートしていないシリアライザを使用します(正しくラウンドトリップしないため)。私たちは、次の現実の人たちのためにこれに対処するつもりです。

一方で、組み込みフォーマッタの代わりにJson.NET(使用可能なものはhere)を使用するカスタムJSON MediaTypeFormatterの実装を使用することができます。

更新:またJSON.NETフォーマッタをフックについてヘンリックのブログをチェックアウト:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

+1

ちょうどRCリリースにアップグレードされましたが、これはまだ問題であるようです。最終リリース前に変更されるかどうか、または読み込み専用のプロパティがシリアル化されることを期待してはいけないのかどうか不思議です。ありがとう! –

+0

最新の夜間ビルドを試すことができます(手順:http://aspnetwebstack.codeplex.com/discussions/353867)。また、実際にシステムからBetaビットをアンインストールしたことを確認してください。それでも問題が解決しない場合は、http://aspnetwebstack.codeplex.com/をここに投稿してください。ありがとう。 – marcind

+0

私はベータ版をアンインストールしてRCをインストールしましたが、プロジェクトのパッケージをnugetで更新していないので、まだベータ版を使用していました。更新後、読み取り専用プロパティーはJSONを使用してシリアル化されますが、XMLとしてはシリアル化されません。 JSONは私にとって必要なものなので、いいですが、XMLのシリアライゼーションでも同じように動作するはずです。 –

4

の両方を持っている、これは正常な動作である場合、私は知りませんかない。私はこれが入力パラメータに期待されていると言います(その値を設定することはできないので)、出力パラメータに対しては期待していません。だから私はこれが出力パラメータのバグだと言います。そして、ここでの問題を示す例です:

モデル:

public class Product 
{ 
    public Product() 
    { 
     Prop1 = "prop1 value"; 
     Prop2 = "prop2 value"; 
     Prop3 = "prop3 value"; 
    } 

    public string Prop1 { get; set; } 

    [ReadOnly(true)] 
    public string Prop2 { get; set; } 

    public string Prop3 { get; protected set; } 
} 

コントローラー:

public class ProductsController : ApiController 
{ 
    public Product Get(int id) 
    { 
     return new Product(); 
    } 
} 

要求:

api/products/5 

結果:

{"Prop1":"prop1 value","Prop2":"prop2 value"} 

プロパティにパブリックセッターがない場合、この場合はProductクラスが出力として使用されるため、通常とは見なされません。

マイクロソフトがリリース前にこれを修正できるように、またはこれが設計上のことであることを少なくとも通知するために、接続チケットを開くことをお勧めします。

関連する問題