Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 公共属性的默认MongoDB序列化_C#_Mongodb_Serialization - Fatal编程技术网

C# 公共属性的默认MongoDB序列化

C# 公共属性的默认MongoDB序列化,c#,mongodb,serialization,C#,Mongodb,Serialization,我知道我的类必须具有公共读写属性,MongoDB驱动程序才能序列化/反序列化我的对象。但是,我想知道是否有方法/首选方法对代码的其余部分隐藏写属性 例如 类产品 { 私人名单发布; 公开名单发布 { 得到 { 返回新列表(releases);//我可以通过传递“releases”的副本来保护它 } 设置 { releases=value;//但在编写时如何保护release? } } } 我希望MongoDB能够序列化/反序列化我的类型,但我不希望我的其余代码能够覆盖它的字段/属性,否则这些字

我知道我的类必须具有公共读写属性,MongoDB驱动程序才能序列化/反序列化我的对象。但是,我想知道是否有方法/首选方法对代码的其余部分隐藏写属性

例如

类产品
{
私人名单发布;
公开名单发布
{
得到
{
返回新列表(releases);//我可以通过传递“releases”的副本来保护它
}
设置
{
releases=value;//但在编写时如何保护release?
}
}
}

我希望MongoDB能够序列化/反序列化我的类型,但我不希望我的其余代码能够覆盖它的字段/属性,否则这些字段/属性应该是私有的。有没有一个模式来处理这个问题?我曾经考虑过使用一个单独的
ProductDoc
类,它只是作为将产品对象进出MongoDB的中介,但我不确定是否有更好的解决方案

我已经很久没有与mongo合作了。但您可以尝试阅读此线程,或尝试使setter受到如下保护:

public List<Release> Releases
{
    get
    {
        return new List<Release>(releases); //I can protect 'releases' when reading by passing a copy of it
    }
    protected set
    {
        releases = value; //BUT how can I protect release when writing?
    }
}
公开列表发布
{
得到
{
返回新列表(releases);//我可以通过传递“releases”的副本来保护它
}
保护集
{
releases=value;//但在编写时如何保护release?
}
}

目前,本页上的最佳答案有一些缺陷,需要了解

正如当前编写的解决方案:

public List<Release> Releases
{
    get
    {
        return new List<Release>(releases); //I can protect 'releases' when reading by passing a copy of it
    }
    protected set
    {
        releases = value; //BUT how can I protect release when writing?
    }
}
将通过向基础集合添加新版本来影响基础集合。这与将集合例程私有化的既定目标直接矛盾

但是,如果您将公开的属性类型更改为实现IEnumerable而不是List,并返回列表的只读版本。比如

public IEnumerable<Release> Releases
{
    get
    {
        return new List<Release>(releases).AsReadOnly();
    }
    protected set
    {
        releases = value;
    }
}

obj.Releases=新列表();

将引发生成错误并阻止修改基础集合。

如果构造函数设置了属性,另一种方法是将它们保持为只读,并使用
MapCreator
告诉MongoDB如何创建类的实例来传递要设置的属性

e、 g.我有一个名为
Time
的类,它有三个只读属性:
Hour
Minute
Second
,还有一个公共构造函数,它需要一小时、一分钟和一秒的值

下面是我如何让MongoDB将这三个值存储在数据库中,并在反序列化期间构造新的
Time
对象的方法

BsonClassMap.RegisterClassMap<Time>(cm =>
{
    cm.AutoMap();
    cm.MapCreator(p => new Time(p.Hour, p.Minute, p.Second));
    cm.MapProperty(p => p.Hour);
    cm.MapProperty(p => p.Minute);
    cm.MapProperty(p => p.Second);
}
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.MapCreator(p=>新时间(p.Hour,p.Minute,p.Second));
cm.MapProperty(p=>p.Hour);
cm.MapProperty(p=>p.Minute);
cm.MapProperty(p=>p.Second);
}

即使使用受保护且私有的setter,mongo驱动程序也能够序列化和反序列化我的类?我之所以这样问,是因为mongo文档说,要序列化,它必须具有公共getter和setter属性以及无参数公共构造函数。这很有效。测试应用程序总是证明api的好方法。这个解决方案da可以工作,但它也引入了一个潜在的不可检测的构建问题。确实,通过将集合设为私有或受保护,MongoDB仍然可以序列化和反序列化对象,如果您尝试设置属性的值,但执行了类似.Add(新版本{})的操作,则无法构建不仅会生成项目,还会修改集合。
public IEnumerable<Release> Releases
{
    get
    {
        return new List<Release>(releases).AsReadOnly();
    }
    protected set
    {
        releases = value;
    }
}
obj.Releases.Add(new Release());
obj.Releases = new List<Release>();
BsonClassMap.RegisterClassMap<Time>(cm =>
{
    cm.AutoMap();
    cm.MapCreator(p => new Time(p.Hour, p.Minute, p.Second));
    cm.MapProperty(p => p.Hour);
    cm.MapProperty(p => p.Minute);
    cm.MapProperty(p => p.Second);
}