[Serializable]
public class FileData
{
private ContentType contentType;
private long size;
private string name;
public ContentType ContentType
{
get { return contentType; }
set { contentType = value; }
}
...
/* same getter/setter logic for the other fields */
}
モデルが存在します私のWebプロジェクトとは別のアセンブリで。
{
"size": 12345,
"contentType": "image/png",
"name": "avatar.png"
}
をどのようにContentType
を変換するために、私は私が持っているカスタムJsonConverter
を登録しているJson.NETを伝えるために:
ので、クライアントは、私がこのクラスに変換する必要がJSONメッセージを送信します目的のために書かれた:上記のコードで
JsonFormatter.SerializerSettings.Converters.Add(new ContentTypeJsonConverter());
私はWEBAPIアプリケーションのグローバルJsonFormatter
obejectを参照しています。
したがって、クライアントからJSONが送信されると、コントローラがメッセージを適切に解析することを期待しています。
残念ながら、それはエラーで失敗します。
は、「キャストまたはSystem.Net.Mime.ContentTypeに可能System.Stringから変換できませんでした。」
私は私FileData
クラスに次のコードを追加することで周りにこれを動作することができます知っている:
public class FileData
{
...
[JsonConverter(typeof(ContentTypeJsonConverter))]
public ContentType ContentType { /* Getter and Setter */ }
}
が、問題は、私はFileData
アセンブリ内JSON.NETへの依存関係を導入してはならないということですタイプが存在する。
FileData
クラスを変更せずにcontentType
メンバの正しい逆シリアル化をトリガする方法はありますか?提案何Brian Rogers私も試した上記に加えて
:
JsonFormatter.SerializerSettings.ContractResolver = new CustomResolver();
次CustomResolver
実装とは:
class CustomResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
var contract = base.CreateContract(objectType);
if (objectType == typeof(ContentType))
{
contract.Converter = new ContentTypeJsonConverter();
}
return contract;
}
}
結果は同じでした。
を作成することができ、その後、 'FILEDATAに値をコピー'class;これにより、他のアセンブリ内のjson.netへの任意のタイプの依存関係が削除されます。 –
TypeDescriptorsを調べて、実行時に属性を動的に追加することもできますが、単純なPOCOクラスよりも労力がかかり、値IMOをコピーすることになります。 –
'FileData'クラスの' contentType'フィールドにpublicアクセサ/ミューテータのペアがありますか?あなたのコンバーターは 'System.Net.Mime.ContentType'型が渡されたときtrueを返すように' CanConvert'メソッドを実装していますか? –