0


0

.NETのXmlSerializerによる逆シリアル化のために単一のXMLファイルに複数のXMLファイルを含める方法
NETで `XmlSerializer`を使用して、他のXMLファイルを含むXMLファイルをロードすることは可能ですか? そしてどうやって?

これは、2つの「親」XMLファイルでXML状態を簡単に共有するためです。 以下のABおよびBC。

例:

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

namespace XmlSerializerMultipleFilesTest
{
    [Serializable]
    public class A
    {
        public int Value
        { get; set; }
    }

    [Serializable]
    public class B
    {
        public double Value
        { get; set; }
    }

    [Serializable]
    public class C
    {
        public string Value
        { get; set; }
    }

    [Serializable]
    public class AB
    {
        public A A
        { get; set; }
        public B B
        { get; set; }
    }

    [Serializable]
    public class BC
    {
        public B B
        { get; set; }
        public C C
        { get; set; }
    }

    class Program
    {
        public static void Serialize(T data, string filePath)
        {
            using (var writer = new StreamWriter(filePath))
            {
                var xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(writer, data);
            }
        }
        public static T Deserialize(string filePath)
        {
            using (var reader = new StreamReader(filePath))
            {
                var xmlSerializer = new XmlSerializer(typeof(T));
                return (T)xmlSerializer.Deserialize(reader);
            }
        }

        static void Main(string[] args)
        {
            const string fileNameA = @"A.xml";
            const string fileNameB = @"B.xml";
            const string fileNameC = @"C.xml";

            const string fileNameAB = @"AB.xml";
            const string fileNameBC = @"BC.xml";

            var a = new A(){ Value = 42 };
            var b = new B(){ Value = Math.PI };
            var c = new C(){ Value = "Something rotten" };

            Serialize(a, fileNameA);
            Serialize(b, fileNameB);
            Serialize(c, fileNameC);

            // How can AB and BC be deserialized from single
            // files which include two of the A, B or C files.
            // Using ideally something like:
            var ab = Deserialize(fileNameAB);
            var bc = Deserialize(fileNameBC);
            // That is, so that A, B, C xml file
            // contents are shared across these two
        }
    }
}

したがって、A、B、Cファイルには次のものが含まれます。

A.xml

  42

B.xml

  3.1415926535897931

C.xml

  Something rotten

そして、「親」XMLファイルには、次のようなXML組み込みファイルが含まれています(このようなものは見つかりませんでした)。

AB.xml


BC.xml


もちろん、これはABとBCに IXmlSerializer`を実装することで解決できると思いますが、クラス自体が [Serializable] `属性のみを必要とする簡単な解決策または一般的な解決策があることを望んでいました。 つまり、複数のファイルへの分割はXMLのみであり、 `XmlSerializer`自体またはこの上のカスタムジェネリックシリアライザーによって処理されます。

私はこれがapp.configでいくらか可能であるべきであることを知っています(https://stackoverflow.com/questions/480538/use-xml-includes-or-config-references-in-app-config-to-include-other-のように) config-files [XMLインクルードまたはapp.configの構成参照を使用して他の構成ファイルの設定を含める])、しかし、XmlSerializerに基づくソリューションを好むでしょう。

ありがとう。

1 Answer


1


簡単な答えはイエスです。`IXmlSerializer`を実装しなくても可能です。 しかし、それは本当にugいです。 おそらくIXmlSerializerを実装するよりもいでしょう。 http://www.theserverside.net/tt/blogs/showblog.tss?id=CustomXmlSerializers [開始するにはこれをチェックしてください。] `XmlSerializer`を作成します。 次に、sgen.exeからの出力を変更します。 楽しくない。 まったく面白くない。 しかし可能です。