在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的最终基类:)
所以问题是:
谢谢大家的回答,请不要将此问题标记为重复,因为已经回答的解决方案不适合我们的问题.请在标记之前阅读问题.谢谢
PS所有评论将不胜感激:)
我想将我的代码从 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) 我们已经创建了很多 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)
我们如何定义这个自动执行的命令,以避免手动更新?
谢谢你们!
我想为我的团队自定义标签颜色。我在 docs.microsoft.com自定义卡片的文章中的以下地方找到了描述
但是当我打开我的设置时,我没有一个名为 的菜单点Tag Colors:

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

如何访问更多菜单点?
我想知道,依赖注入在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,并且可以更改实现,但是我不知道该怎么做。
有一个类设置了核心服务依赖项: …
我有包含一些受保护和私有成员的测试类:
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) 有没有办法在 Azure 中为 blob 添加其他信息?
我想存储一些相关信息,这些信息将 blob 连接到文档数据库中的其他实体,例如包含 JSON 的字符串。
我知道在使用 Azure 存储资源管理器时有 blob 的元数据,但我想从代码中使用它。
这是关于此主题的相关问题: 将描述/元数据添加到 Azure Blob
以及如何根据此元数据检索 blob?