XmlSerializer бросает InvalidOperationException при использовании универсального ограничения типа где

Когда я пытаюсь выполнить следующий код (два разделенных блока)

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

Я получаю это исключение:

Система. InvalidOperationException: Не мог генерировать временный класс (result=1). ошибка CS0012: ITest типа определяется в блоке, на который не ссылаются. Необходимо добавить ссылку на блок ClassLibrary, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null hinzu.

в System. Xml. Сериализация. Компилятор. Скомпилируйте (Родитель блока, Строка не уточнено, XmlSerializerCompilerParameters xmlParameters, доказательство Доказательства)
в System. Xml. Сериализация. TempAssembly. GenerateAssembly (XmlMapping [] xmlMappings, Тип [] типы, Строка defaultNamespace, доказательство Доказательства, параметры XmlSerializerCompilerParameters, блок блока, блоки Хеш-таблицы) в System. Xml. Сериализация. TempAssembly.. ctor (XmlMapping [] xmlMappings, Тип [] типы, Строка defaultNamespace, Строковое местоположение, доказательство Доказательства) в System. Xml. Сериализация. XmlSerializer. GenerateTempAssembly (XmlMapping xmlMapping, тип Типа, Строка defaultNamespace) в System. Xml. Сериализация. XmlSerializer.. ctor (Вводят тип, Строка defaultNamespace) в Программе. Основной (Строка [] args)

Удаление, где T: ITest от TestClass или не использования дженериков вообще (например, использования общедоступного пустого Теста (ITest x)) будет препятствовать тому, чтобы исключение было брошено, но мне нужна эта конструкция в моем реальном приложении.

Кто-либо понимает, почему XmlSerializer не может обработать где ограничение?

7
задан Martin 7 March 2011 в 09:34
поделиться

3 ответа

Думаю, вам не повезло. Вот ответ Microsoft по этому вопросу:

Благодарим вас за отправку этого вопроса. К сожалению, мы решили, что она не будет решена, поскольку риск перевешивает пользу от исправления. По адресу когда появится следующая возможность внести это изменение, мы надеемся. что новые технологии сериализации технологии в будущей версии Windows Communication Foundation позволят решить вашу проблему. Если эта проблема вызывает значительные негативные влияние на бизнес, обратитесь в Службу поддержки продуктов Microsoft. I сожалею, что мы не смогли предоставить лучшее решение. Будьте уверены, что мы серьезно рассмотрели этот вопрос - решение решение "Не исправить" никогда не бывает простым. принять.

В основном это говорит о том, что вам следует использовать DataContractSerializer вместо XmlSerializer или изменить структуру объектов.

6
ответ дан 7 December 2019 в 10:00
поделиться

Тип ITest определен в {{1 }} сборка, на которую нет ссылки. Вы должны добавить ссылку на сборку ClassLibrary

Вы это сделали?

-3
ответ дан 7 December 2019 в 10:00
поделиться

На самом деле, вы можете быть ОЧЕНЬ близки и даже не знать об этом.

Попробуйте определить пустой класс-помощник внутри вашей сборки ClassLibrary и поместить [Serializable, XmlInclude(SerializationReferenceHelper)] прямо над public class TestClass.

Проблема в том, что парсер Xml не знает о втором классе, потому что он находится в другой сборке и на него ссылается только ограничение where в вашем коде. Да, Microsoft могла бы написать небольшую примочку для поиска во всех известных сборках... не знаю, почему они этого не делают. Но на данный момент это может сработать.

ClassLibrary

public class SerializationReferenceHelper { }
public interface ITest { }

Program

[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));
    }
}
3
ответ дан 7 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: