none
WCF+SharePoint2010+Rest+.net3.5でAbstractClass(抽象クラス)またはinterface(インターフェース)を使いたい。 RRS feed

  • 質問

  • SharePoint 2010の上で、WCFサービスを作成しています。

    WCFをRestで作成し、以下のようなサンプルサービスを作りました。
    これをクライアントから呼び出し、派生クラスを取得したいと思っています。
    しかし、サーバーからJson文字列は返ってくるのですが、それが上手くDeserialize出来ません。
    どうしたら良いでしょうか?

    開発環境はC#,.net3.5 VS2010です。

        public interface IAnimal
        {
            [DataMember]
            string Name { get; }
        }
    
        [DataContract]
        public class Dog1 : IAnimal
        {
            [DataMember]
            public string Name { get; set; }
    
            [DataMember]
            public int Inu { get; set; }
        }
    
        [DataContract]
        public class Cat1 : IAnimal
        {
            [DataMember]
            public string Name { get; set; }
            [DataMember]
            public DateTime Neko{ get; set; }
        }
    
        [DataContract]
        [KnownType(typeof(Dog2))]
        [KnownType(typeof(Cat2))]
        public abstract class AnimalBase
        {
            [DataMember]
            public string Name { get; set; }
        }
    
        [DataContract]
        public class Dog2 : AnimalBase
        {
            [DataMember]
            public int Inu { get; set; }
        }
    
        [DataContract]
        public class Cat2 : AnimalBase
        {
            [DataMember]
            public DateTime Neko { get; set; }
        }
    
    
        [ServiceContract]
        public interface IAbstractService
        {
            #region interfaceテスト用メソッド
            /// <summary>
            /// Interfaceを返すサンプルメソッド
            /// </summary>
            [OperationContract]
            [WebInvoke(
                UriTemplate = "/GetInterface1",
                RequestFormat = WebMessageFormat.Json,
                BodyStyle = WebMessageBodyStyle.Wrapped,
                ResponseFormat = WebMessageFormat.Json,
                Method = "POST")]
            IAnimal GetInterface1();
    
            /// <summary>
            /// AbstractClassを返すサンプルメソッド
            /// </summary>
            [OperationContract]
            [WebInvoke(
                UriTemplate = "/GetAbstractClass1",
                RequestFormat = WebMessageFormat.Json,
                BodyStyle = WebMessageBodyStyle.Wrapped,
                ResponseFormat = WebMessageFormat.Json,
                Method = "POST")]
            AnimalBase GetAbstractClass1();
        }
    
        public class AbstractService : IAbstractService
        {
            #region interfaceテスト用メソッド
            /// <summary>
            /// Interfaceを返すサンプルメソッド
            /// </summary>
            public IAnimal GetInterface1()
            {
                return
                    new Dog1 { Name = "犬", Inu = 18 };
            }
            /// <summary>
            /// AbstractClassを返すサンプルメソッド
            /// </summary>
            public AnimalBase GetAbstractClass1()
            {
                return
                    new Dog2
                    {
                        Name = "犬",
                        Inu = 30,
                    };
            }
        }
    
    



    2014年3月24日 11:27

回答

  • しかし、サーバーからJson文字列は返ってくるのですが、それが上手くDeserialize出来ません。
    どうしたら良いでしょうか?

    上手くDesrialize出来ません、ではわかりません。質問者さんは何が起きているのかを記述すべきです。

    と言いつつ、既知のデータ コントラクト型を参考にKnownType属性やあとほとんどドキュメントがありませんがServiceKnownType属性や、最終的にはapp.configに記載するとDesirializeできるようになります。

    • 回答としてマーク ti_ti_ti 2014年3月25日 2:53
    2014年3月24日 23:10

すべての返信

  • しかし、サーバーからJson文字列は返ってくるのですが、それが上手くDeserialize出来ません。
    どうしたら良いでしょうか?

    上手くDesrialize出来ません、ではわかりません。質問者さんは何が起きているのかを記述すべきです。

    と言いつつ、既知のデータ コントラクト型を参考にKnownType属性やあとほとんどドキュメントがありませんがServiceKnownType属性や、最終的にはapp.configに記載するとDesirializeできるようになります。

    • 回答としてマーク ti_ti_ti 2014年3月25日 2:53
    2014年3月24日 23:10
  • すいません。自己解決しました。

    結局、KnownTypeの指定だけで大丈夫なようです。

    2014年3月25日 2:53