1

Silverlight プロジェクト (SL4) では、リスト ( IList<AnotherModel>) を含む可能性のあるモデルを使用しています。グッド プラクティスとルールCA2227:CollectionPropertiesShouldBeReadOnly によると、IListプロパティにはパブリック セッターがありません。動作している DataContractSerializer を使用してモデルをシリアル化します。しかし、デシリアライズしようとすると、DataContractSerializer のReadObject(Stream)メソッドによって SecurityException がスローされ、パブリック セッターがないためにターゲット プロパティ (プロパティを指しているIList) を設定できないと不平を言います。

は封印されており、拡張可能でも柔軟でもないため、メソッドまたはコレクション項目を転送する他の方法でforeach-loop を使用しDataContractSerializerて逆シリアル化できるような追加のルールを追加する機会は現在ありません。IListsAdd()

また、(Reflector を使用して) ソースを掘り下げてDataContractSerializer小さなフォークを作成しようとしましたが、非常に深く掘り下げる必要があり、シリアル化クラス全体を複製することは実行可能な解決策ではないようです。

を使用してパブリック セッターを使用せずにリストをシリアル化する別の機会はありDataContractSerializerますか?

あなたのアイデアを事前にどうもありがとうございました!


更新
XmlSerializer を使用して解決しました。


トーマス

4

2 に答える 2

1

私たちの場合、私たちは厳密に拘束されていないことがわかりましたDataContractSerializer。興味深いことに、XmlSerializer DOESは読み取り専用IListのシリアル化をサポートしています。実際、この場合はIListインターフェイスのパブリックセッターを許可していません(インターフェイスプロパティを逆シリアル化できません)が、IListsアイテムを(逆)シリアル化することは魅力のように機能します。

私たちにとっての唯一の変更は、に加えて[XmlInclude]属性を追加することでした(そしてもちろん、からへ[KnownType]の数行を置き換えました。DataContractSerializer.WriteObject(...)XmlSerializer.Serialize(...)

ご協力ありがとうございました!=)

于 2010-05-10T12:32:58.133 に答える
1

具体的な (変更可能な) 型を使用し、DCS に必要なものを提供します。

私にとってはうまく機能します(通常、DataContractSerializable クラスで具象型のみを指定します)。汎用シリアライゼーションの全体的なアプローチはウォッシュであり、警告が付属しています-戦いを選んでください。または、ISerializable (uhg) などの別のアプローチを使用します。

于 2010-05-07T08:43:23.540 に答える