2016-06-16 12 views
1

VB2012:My.Settingsクラスのクローン(コピーではない)を作成しようとしています。私はSOMySettingsのクローンを作成する

Public Function DeepClone(Of T)(ByVal a As T) As T 
    Using stream As New System.IO.MemoryStream 
     Dim formatter As New BinaryFormatter 
     formatter.Serialize(stream, a) 
     stream.Position = 0 
     Return DirectCast(formatter.Deserialize(stream), T) 
    End Using 
End Function 

にここで見つけるDeepClone機能を試してみましたが、それは国会 「TestAppが、バージョン= 10.1で例外で

タイプ 'MyCompany.MyDept.TestApp.My.MySettings' を結果。 0.3、Culture =ニュートラル、PublicKeyToken = null 'は はシリアル化可能とマークされていません。

設定がクラスであり、XMLとして保存されている場合は、それらをクローンする方法が必要ですか、間違ったツリーを吠えているだけですか?

〜AGP

+0

をあなたがそれをクローニングしている方法は、それがすべてをシリアル化できるように、 'Serializable'属性を必要とバイナリシリアル経由で非公開フィールド。 XMLのシリアル化は、その属性を必要としないパブリックフィールドのみをシリアル化します。 –

+0

浅いクローンでは十分ではありませんか? – miroxlav

+0

私はそれに続くサンプルがあります。私は何かを試してみる。 – sinDizzy

答えて

0

は簡単な答えはにBinaryFormatterを使用しないことです。代わりに、XmlSerializer、DataContractSerializer、またはJsonSerializerを使用してください。

(一般的にはSerializable属性とそれを使用する事が推奨されていません。)

+0

XMLのアプローチを試してみました。http://stackoverflow.com/questions/1251277/net-deep-cloning-what-is-the-best-way-to-do-that "MyCompany.MyDept.TestApp.My .MySettingsは保護レベルのためにアクセスできません。パブリックタイプのみが処理できます。 "もう一つのアプローチを試してみましょう。 – sinDizzy

0

あなたが設定の「コピー」を必要とする理由は明らかではありません。 My.SettingsSharedプロパティなので、そのプロパティにはグローバルにアクセスできます。しかし、最初に設定プロパティを読み込んだときに設定ファイルからすべての設定をロードするので、メモリ内に2番目のコピーが本当に必要な場合は、MySettingsクラスの新しいインスタンスを作成し、ファイル再び。あなたはString設定がClientName呼ばれていた場合たとえば、あなたはこのような何か行うことができます:

Dim copy As New My.MySettings() 
Dim clientName As String = copy.ClientName 
関連する問題