4

基本的に、string Yoyo型のオブジェクトYoyoDataがネットワーク経由で返されたときに、以下のコードが機能し、シリアル化される必要があります。

    public interface IHelloV1
    {
        #region Instance Properties

        [DataMember(Name = "Yoyo")]
        string Yoyo { get; set; }

        #endregion
    }


    [DataContract(Name = "YoyoData", Namespace = "http://hello.com/1/IHelloV1")]
    public class YoyoData : IHelloV1
    {
        string Yoyo { get; set; }

        public YoyoData()
        {
            Yoyo = "whatever";
        }
    }
}
4

2 に答える 2

6

私はそうは思わない。

属性はDataMember派生クラスでは継承されません。

詳細については、タイプDataMemberAttributeとその定義方法のドキュメントを参照してください: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx . Inherited = falseこの属性は、属性が派生クラスに伝播されないことを意味するプロパティを指定します。

属性のプロパティに関する詳細については、 http://msdn.microsoft.com/en-us/library/84c42s56( v=vs.71 ).aspxも参照してください。Inherited

とにかく、これは、を定義するクラスではDataContract、プロパティYoyoが と見なされないことを意味するDataMemberため、私にとっては期待どおりに機能しません。

于 2012-08-01T22:34:25.343 に答える
3

動作しないようです:

using System.Runtime.Serialization;
using System.IO;
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            IHelloV1 yoyoData = new YoyoData();
            var serializer = new DataContractSerializer(typeof(YoyoData));

            byte[] bytes;
            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, yoyoData);
                stream.Flush();
                bytes = stream.ToArray();
            }

            IHelloV1 deserialized;
            using (var stream = new MemoryStream(bytes))
            {
                deserialized = serializer.ReadObject(stream) as IHelloV1;
            }

            if (deserialized != null && deserialized.Yoyo == yoyoData.Yoyo)
            {
                Console.WriteLine("It works.");
            }
            else
            {
                Console.WriteLine("It doesn't work.");
            }

            Console.ReadKey();
        }
    }

    public interface IHelloV1
    {
        #region Instance Properties

        [DataMember(Name = "Yoyo")]
        string Yoyo { get; set; }

        #endregion
    }


    [DataContract(Name = "YoyoData", Namespace = "http://hello.com/1/IHelloV1")]
    public class YoyoData : IHelloV1
    {
        public string Yoyo { get; set; }

        public YoyoData()
        {
            Yoyo = "whatever";
        }
    }
}

しかし、インターフェイス プロパティではなくクラス プロパティでその属性をスローすると、機能します。

于 2012-08-01T22:41:59.897 に答える