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 名および/または名前空間を指定します。タイプ。"

「Install」および「Uninstall」クラスを含むアセンブリをまったく制御できないことを除けば、それは良い考えです。

何か案は?

4

2 に答える 2

2

.NET 3.5 にアクセスできる場合は、DataContract シリアライザーを使用し、IDataContractSurrogate を実装します。サロゲート シリアライゼーションを使用すると、シリアライゼーション時に、シリアライゼーションを台無しにしている厄介な型を別の型に置き換えることができます。サロゲートを完全に制御できます。それはあなたが問題を解決するのに役立つはずです.

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

于 2009-09-26T18:56:01.847 に答える
0

うまくいく答えを見つけました。この記事のコメント: http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx

この記事に私を導きました: http://mfharoon.blogspot.com/2006/12/using-ixmlserializable-to-overcome-not.html

変更する必要があるのは 108 行目だけです。これを読む必要があります。

writer.WriteAttributeString("type", _parameters.GetType().AssemblyQualifiedName.ToString());

型が別のアセンブリにある場合、シリアル化が機能します。

チッ!

于 2009-09-26T21:07:05.577 に答える