2014-01-28 7 views
0

Вот случай, для которого Клонирование объекта не удается:Невозможно клонировать объект класса

[Serializable] 
public class MasterClass 
{ 
    public MasterClass(DataRow row) 
    { 
     EntityData = row; 
    } 

    public DataRow EntityData 
    { 
     get; 
     set; 
    } 
} 

для клонирования я использую метод Удлинитель (Clone()) из этого SO question:

при клонировании следующее сообщение об ошибке MasterClass объекта сообщение сгенерировано во время выполнения:

типа 'System.Data.DataRow' в сборке 'System.Data, Version = 4.0.0.0, культура = нейтральной, PublicKeyToken = b77a5c561934e089' не помечено как сериализуемое.

Любое решение, как справиться с этим?

ответ

2

Попробуйте добавить конструктор без параметров:

public MasterClass() 
{ 
} 

Конвертирование DataRow

Предполагая, что вы DataRow имеет Table:

[Serializable] 
public class MyKeyValue { 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 


[Serializable] 
public class MasterClass 
{ 
    public MasterClass() {} 

    public MasterClass(DataRow row) 
    { 
     var list = new List<MyKeyValue>(); 
     foreach (DataColumn col in row.Table.Columns) 
     { 
      list.Add(new MyKeyValue{Key = col.ColumnName, Value = Convert.ToString(row[col.ColumnName])}); 
     } 
     EntityData = list; 
    } 

    public IEnumerable<MyKeyValue> EntityData 
    { 
     get; 
     set; 
    } 
} 
+0

Проблема заключается не в том, что этот класс должен быть сериализуемым. –

+0

Ах да, перечитайте сообщение об ошибке. –

+0

Конструктор, имеющий параметр 'DataRow', должен построить конструктор для загрузки объекта класса. Любое другое решение? –

2

В зависимости от КН у вас используется DataRow для, вам, вероятно, придется разбирать значения в настраиваемый класс, который можно сериализовать.

+0

Есть ли простой способ сделать это, а не преобразовывать 'DataRow' в пользовательский сериализуемый класс? –

+0

Мне нравится ответ Роберта Фрике (после редактирования). Это самый классный с наименьшим количеством работы. Просто не забудьте преобразовать свои ценности, когда используете их обратно в то, что им нужно. –

1

Вы должны реализовать интерфейс ISerializable - для сериализации и добавить конструктор, который принимает (информация SerializationInfo, контекст StreamingContext) - для десериализации.

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