gpt4 book ai didi

c#-4.0 - 在 Esent 持久字典中存储对象给出 : Not supported for SetColumn Parameter error

转载 作者:行者123 更新时间:2023-12-01 15:56:04 27 4
gpt4 key购买 nike

我正在尝试保存一个实现接口(interface)(如 IInterface)的对象。

private PersistentDictionary<string, IInterface> Object = new PersistentDictionary<string, IInterface>(Environment.CurrentDirectory + @"\Object");

由于许多类实现相同的接口(interface)(所有这些都需要缓存),对于通用方法,我想在字典中存储一个 IInterface 类型的对象。
这样我就可以在任何地方提取该对象类型,将其转换为 IInterface 并使用该对象的方法等内部实现。

但是,一旦 Esent 缓存被初始化,它就会抛出这个错误:
不支持 SetColumn
参数名称:TColumn
实际值为 IInterface。

我尝试不使用 XmlSerializer 来做同样的事情,但无法反序列化接口(interface)类型。此外,[Serializable] 属性不能用于接口(interface),所以我卡住了。

我也曾尝试将接口(interface)的所有实现(类)作为 [Serializable] 作为垂死的尝试,但没有用。

有人知道出路吗?提前致谢!!!

最佳答案

仅支持结构(以及一些基本的 不可变 类,例如字符串)的唯一原因是 PersistentDictionary 是一个直接替代品用于 DictionarySortedDictionary 和其他类似的类。

假设我有以下代码:

class MyClass
{
int val;
}

.
.
.

var dict = new Dictionary<int,MyClass>();
var x = new MyClass();
x.val = 1;
dict.Add(0,x);
x.val = 2;
var y = dict[0];
Console.WriteLine(y.val);

本例中的输出为 2。但如果我使用 PersistentDictionary 而不是常规的,则输出为 1。该类是用值 1 创建的,然后更改加入字典后。由于类是引用类型,当我们从字典中检索项目时,我们也会有更改的数据。

由于 PersistentDictionary 将数据写入磁盘,因此它无法真正以这种方式处理引用类型。将其序列化并将其写入磁盘本质上与将对象视为值类型相同(制作了整个副本)。

因为它的目的是用来代替标准字典,而且它不能完全透明地处理引用类型,所以开发人员选择只支持结构,因为结构已经是值类型。

但是,如果您意识到这个限制并 promise 小心不要落入这个陷阱,您可以让它很容易地序列化类。只需下载源代码并编译您自己的 EsentCollections 库版本。您需要对其进行的唯一更改是更改此行:

if (!(type.IsValueType && type.IsSerializable))

为此:

if (!type.IsSerializable)

这也将允许将类写入 PersistentDictionary,前提是它是可序列化的,并且它的成员也是可序列化的。一个巨大的好处是它还允许您以这种方式在其中存储数组。您需要记住的是,它不是真正的字典,因此当您向它写入对象时,它会存储该对象的副本。因此,在将对象的任何成员添加到 PersistentDictionary 后更新它们不会自动更新字典中的副本,您需要记住手动更新它。

关于c#-4.0 - 在 Esent 持久字典中存储对象给出 : Not supported for SetColumn Parameter error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215195/

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