5

XML宣言を追加せずにオブジェクトをシリアル化するために使用される以下の関数があります。それを含むプロジェクトを Visual Studio 2012 で開いたところ、コード分析で「CA2202: オブジェクトを複数回破棄しないでください」という警告が表示されます。

他のケースでは、必要のない [object].Close を削除することでこの警告を修正しましたが、この場合、何を変更する必要があるのか​​ わかりません。警告のヘルプは正確ではありませんそれがどのように引き起こされたか、またはそれを修正する方法についての情報。

警告が表示される正確な原因と、それを回避するためにリファクタリングするにはどうすればよいですか?

''' <summary>
''' Serialize an object without adding the XML declaration, etc.
''' </summary>
''' <param name="target"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function SerializeElementToText(Of T As New)(target As T) As String
    Dim serializer As New XmlSerializer(GetType(T))
    'Need to serialize without namespaces to keep it clean and tidy
    Dim emptyNS As New XmlSerializerNamespaces({XmlQualifiedName.Empty})
    'Need to remove xml declaration as we will use this as part of a larger xml file
    Dim settings As New XmlWriterSettings()
    settings.OmitXmlDeclaration = True
    settings.NewLineHandling = NewLineHandling.Entitize
    settings.Indent = True
    settings.IndentChars = (ControlChars.Tab)
    Using stream As New StringWriter(), writer As XmlWriter = XmlWriter.Create(stream, settings)
        'Serialize the item to the stream using the namespace supplied
        serializer.Serialize(writer, target, emptyNS)
        'Read the stream and return it as a string
        Return stream.ToString
    End Using 'Warning jumps to this line
End Function

私はこれを試しましたが、どちらも機能しません:

    Using stream As New StringWriter()
        Using writer As XmlWriter = XmlWriter.Create(stream, settings)
            serializer.Serialize(writer, target, emptyNS)
            Return stream.ToString
        End Using
    End Using 'Warning jumps to this line instead
4

2 に答える 2

12

これは、XmlWriterが渡したストリームを破棄することによって発生する誤った警告です。これにより、StringWriterは2回破棄されます。最初はXmlWriterによって、もう1つはUsingステートメントによって破棄されます。

これは問題ではありません。.NETFrameworkオブジェクトを2回破棄してもエラーではなく、問題は発生しません。Dispose()メソッドの実装が不十分な場合、問題になる可能性があります。FxCopは、Dispose()メソッドが正しいかどうかを知るのに十分なほど賢くないため、そのことを通知しない可能性があります。

警告を回避するためにコードを書き直す方法はありません。StringWriterには実際に破棄するものがないため、Usingステートメントから移動しても問題ありません。しかし、それは別の警告、CA2000を生成します。最善の方法は、この警告を無視することです。もう一度見たくない場合は、SuppressMessageAttributeを使用してください。

于 2013-02-05T11:55:58.597 に答える
0

2 つの個別の使用法を持つようにコードを変更してみてください。

Using stream As New StringWriter()
    Using writer As XmlWriter = XmlWriter.Create(stream, settings)

    End Using
End Using
于 2013-02-05T11:49:20.973 に答える