Question

J'ai lu de nombreux articles sur les types connus et je belive mon exemple devrait fonctionner. Mais il ne fonctionne pas. Je reçois l'exception suivante sur désérialisation et ne comprends pas pourquoi:

Erreur dans la ligne 1 Position 2. Attendre élément 'A' de l'espace de noms « http: // schémas .datacontract.org / 2004/07 / ConsoleApplication2 '.. rencontrés 'Element' avec le nom 'C', espace de nom' http://schemas.datacontract.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);
        }
    }
}

Qu'est-ce que je suis absent?

Était-ce utile?

La solution

Changer la façon dont vous créez sérialiseur. Utilisation:

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

au lieu de a.GetType ();

Il fonctionne. Le Xml généré est différent - était quelque chose comme ceci:

<C> ...

et est maintenant:

<A i:type="C"> ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top