2012-03-07 8 views
3

私は、古いアプリケーションの一部のXMLを現在のアプリケーションのオブジェクトにデシリアライズしています。古いXMLには、空の要素(<SomeElement />)が存在することが多く、空の文字列("")として現在非直列化されています。空の要素をデシリアライズしてヌルとして

私はこれが最も適切な行動であることに同意しますが、軽度の刺激物です。私はむしろ彼らがNothingとしてdeserializedされているか、または理想的には無視されていました - 効果は同じでしょう。

これらの要素を無視する手段はありますか?または、それらをデシリアライズしてNothingとすることはできますか?

結論:記載されているどちらのソリューションが自分の長所を持って、私はただ一つの問題のプロパティを持っていた場合 ...

アーロンのソリューションは理想的である - それは、1つの問題のために、単一の修正です。

問題が多い複数のプロパティがある場合は、svickの解決策が優先されます。 ISerializableを実装するには、コンストラクタを作成し、各プロパティに対して特定の処理を行うGetObjectDataメソッドを作成します。

私の問題:私の問題はいくつかのレガシーXMLファイル(時間が経つと消え去る)だけであり、String.IsNullOrEmptyは問題を無視できるので、何もしないことに決めました。必要でない場合は、ISerializableインターフェイスを維持するための追加のオーバーヘッドを必要としません - しかし、多くの場合、これは良い解決策になるので、私の選択した答えです。

答えて

2

これを行うための他の明確な簡単な方法はありませんでした。しかし、あなたは常に自分でシリアライズとデシリアライズをIXmlSerializableを実装して処理することができます:それは大きな問題ではありませんので、

Public Sub ReadXml(ByVal reader As XmlReader) Implements IXmlSerializable.ReadXml 

    reader.ReadStartElement() 
    If (reader.Name = "SomeElement") Then 
     Dim someElementValue = reader.ReadElementString() 

     If someElementValue <> String.Empty Then 
      SomeElement = someElementValue 
     End If 
    End If 
    reader.ReadEndElement() 

End Sub 
1

デシリアライザは要素が存在し、空の文字列を含んでいるため、要素がXMLに存在する場合、要素をNothingに逆シリアル化できません。

<SomeElement/> 

と同じです:あなたは、この動作が必要な場合は

<SomeElement></SomeElement> 

、おそらくそれは、空の文字列を見つけた場合はNothingを返しますあなたの変数のプロパティを作成します。

Public ReadOnly Property SomeElement() As String 
    Get 
     If SomeElementValue = "" Then 
      Return Nothing 
     Else 
      Return SomeElementValue 
     End If 
    End Get 
End Property 
+0

変更を加えることなく、String.IsNullOrEmpty()は、私のいずれかの方法をカバーします。しかし、私はあなたのソリューションが気に入っています - 基本的に単なる好みであるものに対抗するために、このような特別なコーディングを導入する価値があるかどうかを判断する必要があります... – CJM

+0

シリアル化をカスタマイズする方法があります。何も動作しない場合は、常に 'IXmlSerializable'を実装することができます。 – svick

関連する問題