gpt4 book ai didi

c# - 如何执行未标记为可序列化的对象的深层复制(在 C# 中)?

转载 作者:行者123 更新时间:2023-11-30 12:19:19 25 4
gpt4 key购买 nike

我正尝试在 C# 中创建剪贴板堆栈。剪贴板数据存储在 System.Windows.Forms.DataObject 对象中。我想将每个剪贴板条目 (IDataObject) 直接存储在通用列表中。由于位图(似乎)的存储方式,我认为我需要先执行深复制,然后再将其添加到列表中。

我尝试使用二进制序列化(见下文)创建深拷贝,但由于 System.Windows.Forms.DataObject 未标记为可序列化,因此序列化步骤失败。有什么想法吗?

public IDataObject GetClipboardData()
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, Clipboard.GetDataObject());
memoryStream.Position = 0;
return (IDataObject) binaryFormatter.Deserialize(memoryStream);
}

最佳答案

我为另一个问题编写了下面的代码,在这种情况下它可能对您有用:

    public static class GhettoSerializer
{
// you could make this a factory method if your type
// has a constructor that appeals to you (i.e. default
// parameterless constructor)
public static void Initialize<T>(T instance, IDictionary<string, object> values)
{
var props = typeof(T).GetProperties();

// my approach does nothing to handle rare properties with array indexers
var matches = props.Join(
values,
pi => pi.Name,
kvp => kvp.Key,
(property, kvp) =>
new {
Set = new Action<object,object,object[]>(property.SetValue),
kvp.Value
}
);

foreach (var match in matches)
match.Set(instance, match.Value, null);
}
public static IDictionary<string, object> Serialize<T>(T instance)
{
var props = typeof(T).GetProperties();

var ret = new Dictionary<string, object>();

foreach (var property in props)
{
if (!property.CanWrite || !property.CanRead)
continue;
ret.Add(property.Name, property.GetValue(instance, null));
}

return ret;
}
}

但是我不认为这将是您问题的最终解决方案,尽管它可能会给您一个起点。

关于c# - 如何执行未标记为可序列化的对象的深层复制(在 C# 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/201957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com