C# 无法克隆类对象
以下是克隆对象失败的情况:C# 无法克隆类对象,c#,clone,C#,Clone,以下是克隆对象失败的情况: [Serializable] public class MasterClass { public MasterClass(DataRow row) { EntityData = row; } public DataRow EntityData { get; set; } } 对于克隆,我使用以下扩展方法(Clone()): 克隆MasterClass对象时,在运行时抛出
[Serializable]
public class MasterClass
{
public MasterClass(DataRow row)
{
EntityData = row;
}
public DataRow EntityData
{
get;
set;
}
}
对于克隆,我使用以下扩展方法(Clone()
):
克隆MasterClass
对象时,在运行时抛出以下错误消息:
程序集System.Data中的类型System.Data.DataRow,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089未标记为可序列化
任何解决方案如何处理此问题?尝试添加无参数构造函数:
public MasterClass()
{
}
转换
数据行
假设您的DataRow
有一个表
:
[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;
}
}
[可序列化]
公共类MyKeyValue{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
[可序列化]
公共课大师班
{
公共主类(){}
公共主类(数据行)
{
var list=新列表();
foreach(row.Table.Columns中的DataColumn列)
{
添加(新的MyKeyValue{Key=col.ColumnName,Value=Convert.ToString(行[col.ColumnName])));
}
EntityData=列表;
}
公共IEnumerable实体数据
{
得到;
设置
}
}
尝试添加无参数构造函数:
public MasterClass()
{
}
转换
数据行
假设您的DataRow
有一个表
:
[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;
}
}
[可序列化]
公共类MyKeyValue{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
[可序列化]
公共课大师班
{
公共主类(){}
公共主类(数据行)
{
var list=新列表();
foreach(row.Table.Columns中的DataColumn列)
{
添加(新的MyKeyValue{Key=col.ColumnName,Value=Convert.ToString(行[col.ColumnName])));
}
EntityData=列表;
}
公共IEnumerable实体数据
{
得到;
设置
}
}
根据您使用数据行的目的,您可能必须将值解析为可序列化的自定义类。根据您使用数据行的目的,您可能必须将值解析为可序列化的自定义类。您必须实现接口-用于序列化,并添加用于反序列化的构造函数(SerializationInfo,StreamingContext上下文)。必须实现接口-用于序列化,并添加用于序列化的构造函数(SerializationInfo,StreamingContext上下文)-用于反序列化。问题不在于类,而在于属性必须是可序列化的。具有DataRow
参数的构造函数必须是引导类对象的构造函数。还有其他解决方案吗?您可以有两个构造函数。但是您还需要将DataRow
转换为可序列化的对象。是否可以将DataRow
转换为serializable
对象?请参见我的编辑,它将DataRow
存储为对象的可序列化列表MyKeyValue
。但是,所有值都从对象
转换为字符串
。问题不在于类,而是属性必须是可序列化的。具有数据行
参数的构造函数必须是引导类对象的构造函数。还有其他解决方案吗?您可以有两个构造函数。但是您还需要将DataRow
转换为可序列化的对象。是否可以将DataRow
转换为serializable
对象?请参见我的编辑,它将DataRow
存储为对象的可序列化列表MyKeyValue
。但是,所有值都从对象
转换为字符串
。有没有简单的方法来实现这一点,而不是将数据行
转换为自定义可序列化类?我喜欢Robert Fricke的答案(编辑后)。这是最经典的,工作量最少。请记住,在使用值时要将它们转换回所需的值。有没有简单的方法来实现这一点,而不是将DataRow
转换为自定义可序列化类?我喜欢Robert Fricke的答案(后期编辑)。这是最经典的,工作量最少。只要记住在使用它们时将它们转换为需要的值。