2009-09-26 1 views
1

Я работаю с плохо спроектированным API. У меня есть класс, который мне нужно для сериализации, и у меня есть контроль над составом класса, но не с теми типами, которые составляют свойства, которые класс сериализует. Пример приведен ниже:Вложенные классы с тем же именем в отдельных сборках, вызывающих сериализацию Головные боли

<Project> 
    <SomeProperty1 /> 
    <Install> 
    <DefaultStep></DefaultStep> 
    </Install> 
    <Uninstall> 
    <DefaultStep></DefaultStep> 
    </Uninstall> 
</Project> 

Проблема заключается в том, я не имею никакого контроля над «Установить» и типов «Удалить», и их вложенные типы имеют такое же имя. «Установить» находится в MyCompany.Install.dll и «Удалить» находится в MyCompany.Uninstall.dll. Но кикер - это MyCompany.Uninstall.dll референции MyCompany.Install.dll, что совершенно бессмысленно. Я знаю, что это плохой дизайн (вся структура, с которой я имею дело, ужасен), но у меня нет выбора в работе с ней.

Ошибки я получаю:

«Типы 'MyCompany.Install.Uninstall.DefaultStep' и 'MyCompany.Install.DefaultStep' оба используют имя типа XML, 'DefaultStep', из пространства имен ''. Используйте атрибуты XML , чтобы указать уникальное имя и/или пространство имен XML для этого типа. "

Это была бы хорошая идея, если бы у меня не было никакого контроля над сборками, которые содержат классы «Установить» и «Удалить».

Любые идеи?

ответ

0

Я нашел ответ, который работает. Комментарии в этой статье: http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx

привели меня к этой статье: http://mfharoon.blogspot.com/2006/12/using-ixmlserializable-to-overcome-not.html

Единственное, что вам нужно изменить в строке 108, который должен прочитать:

writer.WriteAttributeString («тип», . _parameters.GetType() AssemblyQualifiedName.ToString());

Это позволит сериализации работать, если тип находится в отдельной сборке.

HTH!

2

Если у вас есть доступ к .NET 3.5, я бы использовал сериализатор DataContract и реализовал IDataContractSurrogate. Суррогатная сериализация позволяет вам заменить суетливый тип, который закручивает сериализацию с альтернативным типом во время сериализации. У вас есть полный контроль над суррогатом. Это должно помочь вам решить проблему.

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx

+0

Слайк, я никогда не видел этого раньше. –

+0

@Greg: Я был поражен, когда нашел его тоже. Бесконечное предвидение Инженеры Microsoft никогда не перестают удивлять меня. Учитывается каждый сценарий. ;) – jrista

+0

Спасибо за помощь. Я опубликовал решение, которое я нашел ниже. – AdvancedREI