1

以前にシリアライズした XML のデシリアライズに問題があります。

私のクラスは、xsd.exe ユーティリティによって .xsd から生成されます。.xsd は政府によって発行され、通信の標準化に使用されていたため、私は .xsd の構造に影響を与えていません...

問題は、オブジェクトを作成し、それにいくつかのプロパティを設定し、XmlSerializer を使用してシリアル化し、逆シリアル化すると、最初と同じ「コンテンツ」が得られないことです。XML の一部の要素は、これらの要素が最初にシリアル化されたプロパティではなく、"Any" プロパティで逆シリアル化されます。

説明が下手かもしれませんが、私の問題を再現するサンプル プロジェクトを作成しました。サンプル プロジェクトは、ここにあります。

編集:わかりました、ここにいくつかのサンプルコードがあります。残念ながら、xsd.exe によって生成されたファイルは 4000 行を超えるため、ここにすべてを貼り付けることはできません。しかし、必要なものはすべてリンクされたファイルにあります。

私のテストコンソールアプリ:

    static void Main(string[] args)
    {
        Pismeno pismeno = new Pismeno();

        #region Build sample content
        pismeno.Sadrzaj = new SadrzajTip();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml("<SomeXml xmlns=\"http://some.namespace.com/\">Some content goes here</SomeXml>");
        pismeno.Sadrzaj.Item = xmlDoc.DocumentElement;

        pismeno.Prilog = new PismenoPrilog[1];
        pismeno.Prilog[0] = new PismenoPrilog();
        pismeno.Prilog[0].VrijemeNastanka = DateTime.Now.ToString("s");

        XmlDocument xmlTitle = new XmlDocument();
        xmlTitle.LoadXml("<Title xmlns=\"http://some.namespace.com/\">Test title 1</Title>");
        pismeno.Prilog[0].Any = new XmlElement[1];
        pismeno.Prilog[0].Any[0] = xmlTitle.DocumentElement;

        pismeno.Prilog[0].Sadrzaj = new SadrzajTip();
        EAdresaTip eat = new EAdresaTip();
        eat.URL = "http://www.example.com/testfile.doc";
        pismeno.Prilog[0].Sadrzaj.Item = eat;
        #endregion

        // Serialize object, and then deserialize it again
        string pismenoSer = Serialize(pismeno);
        Pismeno pismeno2 = Deserialize<Pismeno>(pismenoSer);

        // Objects to compare. "source" has source.Sadrzaj and source.Prilog properties set
        // "shouldBeTheSameAsSource" has shouldBeTheSameAsSource.Any property set
        Pismeno source = pismeno;
        Pismeno shouldBeTheSameAsSource = pismeno2;
    }

    public static string Serialize(object o)
    {
        string ret = null;

        using (var stream = new MemoryStream())
        {
            XmlWriter xw = new XmlTextWriter(stream, Encoding.UTF8) { Formatting = Formatting.Indented };

            new XmlSerializer(o.GetType()).Serialize(xw, o);
            stream.Flush();
            stream.Seek(0, SeekOrigin.Begin);

            ret = (new StreamReader(stream, Encoding.UTF8)).ReadToEnd();
        }

        return ret;
    }

    public static T Deserialize<T>(string xml)
    {
        return (T)new XmlSerializer(typeof(T)).Deserialize(XmlReader.Create(new StringReader(xml)));
    }
4

0 に答える 0