سؤال

لقد قرأت العديد من المقالات حول الأنواع المعروفة وأدق مثالي يجب أن تعمل. لكنها لا. أحصل على الاستثناء التالي عن التحيز ولا أفهم لماذا:

خطأ في وضع الخط 1 2. توقع عنصر "A" من مساحة الاسم "http://schemas.dataconactract.org/2004/07/consoleapplication2.".. واجهت" عنصر "مع الاسم" C "، واسم الأساس"http://schemas.dataconactract.org/2004/07/consoleapplication2.'.

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

namespace ConsoleApplication2
{
    [DataContract][KnownType(typeof(C))]class A { }
    [DataContract]class C : A { }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new C();
            string data;

            var serializer = new DataContractSerializer(a.GetType());
            using (var sw = new StringWriter())
            {
                using (var xw = new XmlTextWriter(sw))
                    serializer.WriteObject(xw, a);
                data = sw.ToString();
            }

            serializer = new DataContractSerializer(typeof(A));
            using (var sr = new StringReader(data))
            using (var xr = new XmlTextReader(sr))
                a = (A)serializer.ReadObject(xr);
        }
    }
}

ماذا ينقصني؟

هل كانت مفيدة؟

المحلول

تغيير الطريقة التي تنشئها تسلسل. يستخدم:

var serializer = new DataContractSerializer(typeof(A));

بدلا من a.gettype ()؛

إنها تعمل. كان XML الذي تم إنشاؤه مختلف - كان شيئا مثل هذا:

<C> ...

والآن هو:

<A i:type="C"> ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top