2016-06-16 3 views
1

VB2012: Я пытаюсь сделать клон (а не копию) класса My.Settings. Я пробовал функцию DeepClone найти здесь на SOСделайте клон My.Settings

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 

, но это приводит к исключению

Тип 'MyCompany.MyDept.TestApp.My.MySettings' в Ассамблее «TestApp, Version = 10.1. 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.Settings - это свойство Shared, то параметры, которые он содержит, доступны на глобальном уровне. Однако, поскольку он загружает все свои настройки из файлов конфигурации при первом чтении свойства настройки, если вам действительно нужна вторая копия в памяти, вы можете просто создать новый экземпляр класса MySettings и позволить ему заполнять себя из файла еще раз. Например, если вы имели String установки под названием ClientName, вы могли бы сделать что-то вроде этого:

Dim copy As New My.MySettings() 
Dim clientName As String = copy.ClientName 

 Смежные вопросы

  • Нет связанных вопросов^_^