2

requestDto のプロパティとして使用したいカスタム XML シリアライゼーションとデシリアライゼーションを必要とする型があります。

JSON の場合、JsConfig.SerializeFn を使用できますが、XML 用の同様のフックはありますか?

4

1 に答える 1

4

ServiceStack は内部で .NET の XML DataContract シリアライザーを使用します。基になる .NET の Framework 実装によって提供されるものを超えてカスタマイズすることはできません。

カスタム リクエストをサポートするために、デフォルトのリクエスト処理をオーバーライドできます。ServiceStack のSerialization and Deserialization wiki ページには、リクエスト処理をカスタマイズするさまざまな方法が示されています。

カスタム リクエスト DTO バインダーを登録する

base.RequestBinders.Add(typeof(MyRequest), httpReq => ... requestDto);

自動デシリアライゼーションをスキップし、Request InputStream から直接読み取ります

ServiceStack に逆シリアル化をスキップし、DTO にIRequiresRequestStreamリクエストを自分で (サービス内で) 実装して逆シリアル化させることで、自分で処理するように指示します。

//Request DTO
public class Hello : IRequiresRequestStream
{
    /// <summary>
    /// The raw Http Request Input Stream
    /// </summary>
    Stream RequestStream { get; set; }
}

デフォルトの XML コンテンツ タイプ形式をオーバーライドする

別の XML シリアライザーを使用したい場合は、独自のカスタム メディア タイプを登録することで、ServiceStack のデフォルトのコンテンツ タイプを上書きできます。次に例を示します。

string contentType = "application/xml";
var serialize = (IRequest request, object response, Stream stream) => ...;
var deserialize = (Type type, Stream stream) => ...;

//In AppHost.Configure method pass two delegates for serialization and deserialization
this.ContentTypes.Register(contentType, serialize, deserialize);    
于 2012-11-21T17:23:51.437 に答える