7

次のコードを実行しようとすると (2 つの別個のアセンブリ)

ClassLibrary.cs

public interface ITest
{
}

Program.cs

using System;

public class TestClass
{
    public void Test<T>(T x) where T : ITest { }
}

static class Program
{ 
    static void Main(string[] args)         
    {
        new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
    }
}

次のコマンドを使用して Windows 7 64 ビットでコンパイル:

c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /target:library ClassLibrary.cs

c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /reference:ClassLibrary.dll Program.cs

私はこの例外を受けています:

System.InvalidOperationException: 一時クラスを生成できません (結果 = 1)。エラー CS0012: ITest 型は、参照されていないアセンブリで定義されています。アセンブリ ClassLibrary、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null ヒンズーへの参照を追加する必要があります。

System.Xml.Serialization.Compiler.Compile (アセンブリの親、文字列 ns、XmlSerializerCompilerParameters xmlParameters、証拠の証拠)
で System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping[] xmlMappings、Type[] の種類、文字列 defaultNamespace、証拠の証拠、 XmlSerializerCompilerParameters パラメーター、アセンブリ アセンブリ、Hashtable アセンブリ) の System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings、Type[] タイプ、文字列の defaultNamespace、文字列の場所、証拠の証拠) の System.Xml.Serialization.XmlSerializer.GenerateTempAssembly System.Xml.Serialization.XmlSerializer..ctor (型の種類、文字列の defaultNamespace) で Program.Main(String[] args) で (XmlMapping xmlMapping、型の型、文字列の defaultNamespace)

where T : ITestをTestClassから削除するか、ジェネリックをまったく使用しない (たとえば、public void Test(ITest x)を使用する) と、例外がスローされなくなりますが、実際のアプリケーションではこの構成が必要です。

XmlSerializer が where 制約を処理できない理由を理解している人はいますか?

4

3 に答える 3

6

私はあなたが運が悪いと思います。この問題に関するMicrosoftからの回答は次のとおりです。

この号を提出していただきありがとうございます。残念ながら、修正のリスクがその利益を上回っているため、対処しないことを決定しました。この変更を行う次の機会が来るまでに、WindowsCommunicationFoundationの将来のバージョンの新しいシリアル化テクノロジがシナリオに対応することを期待しています。この問題がビジネスに重大な悪影響を及ぼしている場合は、マイクロソフト製品サポートサービスにお問い合わせください。これ以上の解決策を提供できなかったことを残念に思います。この問題を真剣に検討したのでご安心ください。修正しないという決定を下すのは決して簡単ではありません。

これは基本的に、 XmlSerializerの代わりにDataContractSerializerを使用するか、オブジェクト構造を変更する必要があることを示しています。

于 2010-03-02T07:57:21.603 に答える
3

実際、あなたはとても近くにいるかもしれませんが、それを知らないかもしれません.

ClassLibrary アセンブリ内に空のヘルパー クラスを定義して、 の[Serializable, XmlInclude(SerializationReferenceHelper)]すぐ上に配置してみてくださいpublic class TestClass

問題は、2 番目のクラスが別のアセンブリにあり、コード内の where 制約によってのみ参照されるため、Xml パーサーが 2 番目のクラスを認識しないことです。はい、マイクロソフトは、既知のすべてのアセンブリを調べるためにちょっとしたことを書くことができます...なぜそうならないのかわかりません。しかし、今のところこれでうまくいくかもしれません。

クラスライブラリ

public class SerializationReferenceHelper { }
public interface ITest { }

プログラム

[Serializable, XmlInclude(typeof(SerializationReferenceHelper))]
public class TestClass
{
    public void Test<T>(T x) where T : ITest { }
}

static class Program
{ 
    static void Main(string[] args)         
    {
        new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
    }
}
于 2010-03-04T18:09:34.797 に答える
-3

タイプ ITest は、参照されていないアセンブリで定義されています。アセンブリ ClassLibrary への参照を追加する必要があります

あなたはこれをしましたか?

于 2010-03-02T07:47:50.797 に答える