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).aspxInherited以获取有关属性的更多详细信息。

无论如何,这意味着在您定义的类中DataContract,该属性Yoyo不会被视为 aDataMember所以对我来说它不会按预期工作。

于 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 回答