0

TWith2Sugars がここに投稿した拡張メソッドが本当に気に入っています。しかし、私は奇妙な問題に遭遇しました。これを共有クラス ライブラリに入れてシリアル化関数を呼び出すと、次のエラーが発生します。

タイプ MyType は予期されていませんでした。XmlInclude または SoapInclude 属性を使用して、静的に認識されていない型を指定します。

少し調べてみたところ、XmlSerializer は認識できる型のみをシリアル化できることがわかりました。これは、クラス ライブラリにあるクラスを意味すると解釈します。そのライブラリに基づいて構築したプロジェクトではありません。

これを回避する方法はありますか?この関数をクラス ライブラリに配置できますか?それとも、それを使用する各プロジェクトに配置する必要がありますか?

アップデート:

何が問題を引き起こしているのかを突き止めました。次のコードがありました:

object o = new MyClass();
o.Serialize();

これがエラーの原因でした。コードを次のように変更したとき:

MyClass c = new MyClass();
c.Serialize();

すべてがうまくいきました。したがって、学んだ教訓 - 一般的なオブジェクトを (逆) シリアル化しようとしないでください。参照したリンクで最も気に入った点は、クラスに XML 属性タグを付ける必要がないことです。拡張メソッドは機能しました。

質問を締めくくる目的で、[XmlInclude] の使用を示すコード サンプルを使用して、Marc の回答(Marc を含む) を拡張する人に回答を授与します。

4

2 に答える 2

0

このソースでは、2番目のアセンブリへの参照を追加して使用することでこれを行うことができますが、これにより[XmlInclude]、プロジェクトの循環的な混乱にすぐに陥る可能性があります。これらのオプションは、実行時にシリアライザーのコンストラクターに指定することもできます。

using System;
using System.Xml.Serialization;
[Serializable] public class Foo { }
[Serializable] public class Bar : Foo {}

static class Program {
    static void Main()
    {
        XmlSerializer ser = new XmlSerializer(typeof(Foo),
            new Type[] { typeof(Bar) });
        ser.Serialize(Console.Out, new Bar());
    }
}

拡張メソッドについて; を追加して、 -params Type[] extraTypesに渡すことができます。その後、現在のように、またはとして使用できます。extraTypesXmlSerializer.Serialize(typeof(Bar))

于 2009-02-05T13:57:43.973 に答える