2

重複の可能性:
XmlSerializer-タイプを反映するエラーがありました

XmlSerializer ser = new XmlSerializer(typeof(configType));

タイプ「MyNameSpace.configType」を反映するエラーがありました。

configType問題を見つけることを期待して、もう少し詳しく説明します。表面上冗長な属性を削除する以外に、xsd.exeから生成した後に行った唯一の変更は、生成されたクラスの1つを自分のものに置き換えることでした。これにより、オプションの要素のシリアル化をより適切に実装できます。

そのinnerExceptionを調べるためのヒントをありがとう、それは私がIXmlSerializableを実装するようにしたクラスにさかのぼります。これは現在、独自のファイルにあり、以下に示されています。

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace MyNameSpace
{
    [Serializable(), XmlType(Namespace = "MyNameSpace")] //Naughty xsd.exe!
    public class OpOpts : IXmlSerializable
    {
        void defaultFlags()
        {
            Opt1 = true;
            Opt2 = true;
            Opt5 = false;
        }

        public System.Xml.Schema.XmlSchema GetSchema() { return (null); }
        public void ReadXml(XmlReader reader)
        {
            defaultFlags();
            //            reader.Read();
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                switch (reader.Name)
                {
                    case "Opt1": Opt1 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt2": Opt2 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt5": Opt5 = reader.ReadElementContentAsBoolean();
                        break;
                    default:
                        throw new Exception("Invalid XML tag " + reader.Name + " found under OpOpts.");
                }
            }
        }
        enum OptionEnum
        {
            Opt1, Opt2, Opt5
        }
        public void WriteXml(XmlWriter writer)
        {
            OpOpts defOpts = new OpOpts();
            if (Opt1 != defOpts.Opt1) writer.WriteElementString("Opt1", Opt1.ToString());
            if (Opt2 != defOpts.Opt2) writer.WriteElementString("Opt2", Opt2.ToString());
            if (Opt5 != defOpts.Opt5) writer.WriteElementString("Opt5", Opt5.ToString());
        }

        public bool Opt1 { get; set; }
        public bool Opt2 { get; set; }
        public bool Opt5 { get; set; }
    }
}

jdehaanは素晴らしい記事を書きました。IXmlSerializableを実装する適切な方法は?。彼のコードプロジェクトを読んだ後、xsd.exeがプロトクラス用に生成したものが、実装するために拡張したクラスを壊していることがわかりましたIXMLSerializable

具体的には、属性[XmlType(Namespace = "MyNameSpace")]により、「プロパティの反映」というエラーが発生します。それを削除すると、もう少し進んで、含まれているクラスは他のすべての逆シリアル化を渡しますが、上記のクラスを表すメンバーに関しては「無効なXMLタグ」と叫びます。

4

0 に答える 0