小编Gyö*_*yás的帖子

在MongoDB中序列化和反序列化结构的解决方法

在MongoDB中,struct(valuetype)序列化和反序列化是不可能的,因为MongoDB抛出一个异常:BsonClassMapSerializer.cs行:84.

但我想一般解决这个问题.

背景

我们想创建一个库,让我们称之为PolyglotPersistence.Lib.我的"客户"使用这个库将他的数据集保存到数据库中,数据库可以是MongoDB Azure CosomosDB,也可以是自己实现的MemoryDB和其他一些解决方案.

但是由于struct问题,MongoDB无法保存所有类型的数据结构.


我在Stackoverflow中已经发现了一些问题/答案,但这些解决方案并非一般解决方案.

示例1 如何使用MongoDB C#serializer序列化值类型? 这根本不是通用的,当我应用这个解决方案时,我必须为每个结构创建一个Serialize/Deserializer.没关系,可以使用通用的StructSerializer <>来完成,但"客户端"仍然需要为所有结构注册它.这是不可接受的,因为他们不知道数据将被序列化的位置(Cosmos/Mongo/Memory/etc ......).

示例2 使用Mongo C#驱动程序序列化不可变值类型 它几乎是相同的解决方案.必须通过"client"注册一个特殊的Serializer.

示例3 使用MongoDB C#驱动程序反序列化嵌套结构 它们更改为类,这对我们来说不是一个好方法.


可能的解决方案1 我们创建一个新规则:当"客户端"在他的数据结构中使用结构时,他必须从特殊的基类开始,比如说"IStruct".我们为这种类型注册了一个序列化器,问题解决了.

但对于我们的客户来说,这对我们来说是不舒服的,而不是一个防弹解决方案.

可能的解决方案2 当用户为我们的库添加一个新类型(PolyglotPersistence.Lib)时,我们必须递归地遍历此类型,并检测其中是否有结构.当我们找到它时,我们必须注册这种类型的序列化器,当它尚未注册时.

但是对于这个解决方案,我们必须找到客户端数据结构中的所有结构.

可能的解决方案3 为struct的basetype注册Serializer.我不知道它是否存在.但这将是最好的解决方案.struct的最终基类:)


所以问题是:

  1. 是否有最终构建在c#中的结构的最终基类或接口?
  2. 如果我有System.Type我怎么能检测到它是一个结构,百分百安全?

谢谢大家的回答,请不要将此问题标记为重复,因为已经回答的解决方案不适合我们的问题.请在标记之前阅读问题.谢谢

PS所有评论将不胜感激:)

c# serialization struct mongodb

9
推荐指数
1
解决办法
939
查看次数

System.Text.Json 中 JToken.DeepEquals 的等效项是什么?

我想将我的代码从 Newtonsoft Json.Net 迁移到 Microsoft 标准 System.Text.Json。但我找不到替代品JToken.DeepEqual

基本上代码必须在单元测试中比较两个 JSON。参考 JSON 和结果 JSON。我使用 Newtonsoft 中的机制创建了两个JObject,然后将它们与JToken.DeepEqual. 这是示例代码:

[TestMethod]
public void ExampleUnitTes()
{
    string resultJson = TestedUnit.TestedMethod();
    string referenceJson =
    @"
    {
      ...bla bla bla...
      ...some JSON Content...
      ...bla bla bla...
    }";

    JObject expected = ( JObject )JsonConvert.DeserializeObject( referenceJson );
    JObject result = ( JObject )JsonConvert.DeserializeObject( resultJson );
    Assert.IsTrue( JToken.DeepEquals( result, expected ) );
}
Run Code Online (Sandbox Code Playgroud)

如果我纠正了JObject类似于 中的 Newtonsoft System.Text.Json.JsonDocument,并且我能够创建它,只是我不知道如何比较它的内容。

[TestMethod]
public void ExampleUnitTes()
{
    string …
Run Code Online (Sandbox Code Playgroud)

c# json.net system.text.json

9
推荐指数
2
解决办法
2676
查看次数

在我的 nuget 包安装后执行一个操作

我们已经创建了很多 NuGet 包。其中之一是一个工具,它包含一个特殊的编译器,并且像dotnet tool. 命令的名称是“PolyGen”。

我们使用了与使用类似的机制Grpc.Tools,这意味着我们已经在 NugetPackage 中定义了 .targets 文件。它运作良好。

但是当我更新我的 PolyGen 时,之后我必须使用命令手动更新 dotnet 工具dotnet tool update

但是我看到Grpc.Tools更新的时候,自动执行了dotnet工具更新。包管理器控制台写了以下消息:

Executing nuget actions took 181,36 ms
Run Code Online (Sandbox Code Playgroud)

我们如何定义这个自动执行的命令,以避免手动更新?

谢谢你们!

c# nuget nuget-package nuget-spec

6
推荐指数
1
解决办法
356
查看次数

如何在 Azure Board 中自定义标签颜色?

我想为我的团队自定义标签颜色。我在 docs.microsoft.com自定义卡片的文章中的以下地方找到了描述

但是当我打开我的设置时,我没有一个名为 的菜单点Tag Colors菜单结构中的标签颜色

缺少某些菜单点。

即使在同一个文档中,也有两种不同的菜单结构。早些时候,文章显示了不同的菜单结构,与我的相同: 标签颜色不在菜单结构中

如何访问更多菜单点?

kanban azure-devops

4
推荐指数
1
解决办法
2499
查看次数

实体框架依赖注入

我想知道,依赖注入在EFCore中是如何工作的。

我想更改的行为,DbSetFinder不仅要查找DbSet<>DbQuery<>成员,还要查找从其继承的成员。

当前代码如下:

    private static DbSetProperty[] FindSets(Type contextType)
    {
        var factory = new ClrPropertySetterFactory();

        return contextType.GetRuntimeProperties()
            .Where(
                p => !p.IsStatic()
                     && !p.GetIndexParameters().Any()
                     && p.DeclaringType != typeof(DbContext)
                     && p.PropertyType.GetTypeInfo().IsGenericType
                     && (p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)
                         || p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
            .OrderBy(p => p.Name)
            .Select(
                p => new DbSetProperty(
                    p.Name,
                    p.PropertyType.GetTypeInfo().GenericTypeArguments.Single(),
                    p.SetMethod == null ? null : factory.Create(p),
                    p.PropertyType.GetGenericTypeDefinition() == typeof(DbQuery<>)))
            .ToArray();
    }
Run Code Online (Sandbox Code Playgroud)

DbSet<>中找到了该代码,DbContext但未从中继承成员DbSet<>。这意味着我必须使用Type.IsAssignableFrom(Type)方法扩展代码,以查找继承的实例。

我想IDbSetFinder用我的DbSetFinder类覆盖默认值,EFCore为它提供了功能。只是我不知道该在哪里,什么时候该做。

有一个ServiceProvider,并且可以更改实现,但是我不知道该怎么做。

有一个类设置了核心服务依赖项: …

c# entity-framework entity-framework-core

3
推荐指数
1
解决办法
161
查看次数

为什么 CosmosDB 只保存公共成员?

我有包含一些受保护和私有成员的测试类:

    public class Doc_PrivateValues : Document
    {
        public int PublicIntProperty { get; set; }
        public int PublicIntField;

        protected int ProtectedIntProperty { get; set; }
        protected int ProtectedIntField;

        private int PrivateIntProperty { get; set; }
        private int PrivateIntField;

        public SimpleDocument PublicDocument;
        protected SimpleDocument ProtectedDocument;
        private SimpleDocument PrivateDocument;

        public SimpleStruct PublicStruct;
        protected SimpleStruct ProtectedStruct;
        private SimpleStruct PrivateStruct;
    }
Run Code Online (Sandbox Code Playgroud)

我以非常简单的方式将此文档保存到 CosmosDB 中:

        Microsoft.Azure.Documents.Document result = CosmosClient.CreateDocumentAsync( CosmosCollection.SelfLink, document ).Result.Resource;
        document.id = result.Id;
Run Code Online (Sandbox Code Playgroud)

以及数据库中的结果:

{
    "PublicIntField": 2,
    "PublicDocument": {
        "StrVal": "seven",
        "IntVal": 7,
        "id": …
Run Code Online (Sandbox Code Playgroud)

c# azure-cosmosdb

2
推荐指数
1
解决办法
145
查看次数

如何添加和检索 Azure Blob 的其他信息

有没有办法在 Azure 中为 blob 添加其他信息?

我想存储一些相关信息,这些信息将 blob 连接到文档数据库中的其他实体,例如包含 JSON 的字符串。

我知道在使用 Azure 存储资源管理器时有 blob 的元数据,但我想从代码中使用它。

这是关于此主题的相关问题: 将描述/元数据添加到 Azure Blob

以及如何根据此元数据检索 blob?

.net c# blob azure azure-storage

0
推荐指数
1
解决办法
225
查看次数