无法序列化泛型类型

2024-04-15

我正在尝试使用 protobuf-net 序列化通用类型,但 protobuf-net 说它无法序列化它。

As in:

RuntimeTypeModel.Default.CanSerialize(typeof(MyGenericClass<>))

返回 true 并且

RuntimeTypeModel.Default.CanSerialize(typeof(string))

也返回 true。但

RuntimeTypeModel.Default.CanSerialize(typeof(MyGenericClass<string>)) //--> applies to all types that would return true when directly serialized as shown above for the string type

返回假。我想我添加我的方式做错了MyGenericClass到默认的运行时类型模型。因为像

RuntimeTypeModel.Default.CanSerialize(typeof(List<Document>))

返回真。

我当前添加通用类的代码:

var addedGenericType = RuntimeTypeModel.Default.Add(typeof(MyGenericClass<>), false);
addedGenericType.Add("Field1", "GenericField");

错误消息表明我尝试序列化的类型没有合同......这显然是不正确的。

这是一个演示我的问题并证明它应该有效的示例:

using System;
using ProtoBuf;

namespace TestApplication
{
    [ProtoContract]
    public class TestClass<T>
    {
        [ProtoMember(1, DynamicType = true)]
        public T TestField { get; set; }

    }

    public class TestClass2<T>
    {
        public T TestField { get; set; }
    }

    public class Tester
    {
        public void Test()
        {
            DefineSecondClass();
            bool testResult = ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(typeof(TestClass<string>));            
            bool testResult2 = ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(typeof(TestClass2<string>));
            bool testResult3 = ProtoBuf.Meta.RuntimeTypeModel.Default.CanSerialize(typeof(TestClass2<>));
            Console.WriteLine(testResult); // returns true
            Console.WriteLine(testResult2); // returns false
            Console.WriteLine(testResult3); // returns true
        }

        private void DefineSecondClass()
        {
            var type = ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(TestClass2<>), false);
            type.AddField(1, "TestField");
            type[1].DynamicType = true;
        }
    }
}

作为后续(并澄清我的评论)让我们采用以下代码:

使用系统; 使用 ProtoBuf;

namespace TestApplication
{        

    public class TestClass<T>
    {
        public T TestField { get; set; }
    }

    public class ComplexType
    {
        public string SomeFieldA{get; set;}
        public int SomeFieldB{get; set;}
    }

    public class Tester
    {
        public void Test()
        {
            DefineComplexType();
            // how to add the type TestClass<ComplexType> to the RuntimeTypeModel without calling
            // DefineComplexType() again?
        }

        private void DefineComplexType()
        {
            var type = ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(ComplexType), false);
            type.AddField(1, "SomeFieldA");
        }
    }
}

通过做:

var type = ProtoBuf.Meta.RuntimeTypeModel.Default.Add(
    typeof(TestClass2<>), false);
type.AddField(1, "TestField");
type[1].DynamicType = true;

您已经配置了TestClass2<>类型。这很棒,但是......你永远不会使用那种类型。事实上,它不能被使用——Add可能应该抛出一个错误。你用TestClass<string>对于大多数意图和目的来说,这是一个完全独立的Type实例。

我猜这里的逻辑是:如果配置了泛型类型定义,则封闭泛型类型应该从泛型类型定义继承其配置。我可以看到其中的逻辑,但是:目前尚未实现,并且像其他一切一样需要规范、设计、实现、测试、支持和文档。这需要时间。

今天:如果您想与TestClass2<string>, 你应该配置 TestClass2<string>.

请注意,使用属性时,属性本质上存在于封闭类型上;所以情况是这样的TestClass1<string>.TestField[ProtoMember(1, DynamicType = true)] marker.

我怀疑如果你这样做:

private void DefineSecondClass()
{
    var type = ProtoBuf.Meta.RuntimeTypeModel.Default.Add(
        typeof(TestClass2<string>), false);
    type.AddField(1, "TestField");
    type[1].DynamicType = true;
}

那么它就会工作得很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法序列化泛型类型 的相关文章

随机推荐

  • Android:如何将 DatePicker 视图日期格式从 MM/dd/yyyy 更改为 dd/MM/yyyy?

    我很长一段时间以来一直试图找到这个问题的答案 我还查看了以下链接 Android DatePicker 小工具格式 https stackoverflow com questions 4499433 android datepicker w
  • GitHub上的origin和upstream有什么区别?

    有什么区别origin and upstream on GitHub http en wikipedia org wiki GitHub When a git branch a命令执行后 它显示的某些分支的前缀为origin remotes
  • 使用 F# 3.0 进行动态 SQL 查询?

    我尝试过使用 FLINQ 但它对于 F 3 0 beta 来说已经过时了 有人可以指导我如何在 F 中创建动态 SQL 查询吗 我们最近开发了一个库 FSharpComposableQuery 旨在支持 F 3 0 及以上版本中更灵活的查询
  • 为什么“sed -n -i”会删除现有文件内容?

    运行 Fedora 25 服务器版本 sed version给我sed GNU sed 4 2 2以及通常的版权和联系信息 我创建了一个文本文件sudo vi potential sed bug Vi 显示该文件的内容 带有 set lis
  • 将 A 框架与 Three.js 相结合

    我想知道 是否可以将 Three js 元素添加到 A 框架场景中 假设 A frame 是基于 Three js 构建的 并且 three Version 0 74 0 登录到你的控制台这不应该是一件奇怪的事情 对吧 我在我的 A 框架场
  • WPF 中的颜色过渡

    我想要进行颜色过渡BackgroundWPF 窗口的颜色 我怎样才能做到这一点 例如 Brush i color Brushes Red this is the initial color Brush f color Brushes Blu
  • cmake 在 OS X 上找不到 gl.h

    我在 OS X 10 10 上并尝试使用 GLUT 和 OpenGL 构建一个 C 项目 我将其简化为展示我的问题的最小示例 我有以下内容CMakeLists txt cmake minimum required VERSION 2 8 F
  • delphi读取xml元素

    我是 XML 新手 我们需要使用新的进行地理编码必应空间数据 API http msdn microsoft com en us library gg585131 aspx 我已经设法以 xml 格式从他们那里得到结果 我将如何阅读响应中的
  • rake db:test:prepare 中的 Rails 待迁移

    我已经跑了rake db migrate我所有的迁移都运行了 然而 当我尝试跑步时rake db test prepare我收到错误 You have 1 pending migrations 20130724211328 CreateGa
  • Extjs 4(下面有3.4的代码)下载从post请求返回的文件

    我看到了与此略有相关的问题 但没有一个能回答我的问题 我设置了 Ext Ajax request 如下 var paramsStringVar param1 1 param2 two param3 something param4 etc
  • 为什么接口 IOrderedEnumerable 在 T 中不是协变的?

    我正在查看 IOrderedEnumerable 的声明 令我惊讶的是它的 TElement 类型参数不是协变的 public interface IOrderedEnumerable
  • Java 输入问题 - 如何比较字符串[重复]

    这个问题在这里已经有答案了 这看起来很简单 但我已经被困在这里几个小时了 我有一个疑问 当你必须在Java中比较两个字符串时 如果我只是做这样的事情 String var1 hello String var2 hello 然后在另一个函数中
  • SwiftUI:ScrollView 拖动底部工作表

    我正在尝试创建一个 SwiftUI Scrollview 来拖动其容器 如下所示 https drive google com file d 1O92DgsVI1OjM1HEUXUwVywB8gcdShOP view usp sharing
  • PromQL if then 语句等效

    我有一个执行计数的简单 PromQL 查询 sum up container name my container environment name env 这是 Grafana 仪表板的一部分 允许从下拉菜单中选择 env 我想根据环境执行
  • SQL Server 分区查询

    当我运行查询时 select 100 50 它给我 2 很好 但是当我运行查询时 select 50 100 我原以为它会给我 0 5 但它却给了我 0 为什么 我怎样才能得到0 5 select 25 30 100 我预计它会给我 83
  • 获取Webbrowser Control中URL的原始源代码

    我有一个嵌入在 C Windows 应用程序中的浏览器控件 我想获取 url 包含的原始 HTML 不是渲染的 HTML 它可能已被 javascript 修改 与在 IE 中查看源代码中的内容相同 有什么建议么 WebBrowser Do
  • Python:使用 %x(区域设置)格式化的日期与预期不符

    我有一个日期时间对象 我想根据操作系统区域设置 例如在 Windows 7 区域和语言设置中指定 为其创建日期字符串 遵循Python的日期时间格式化文档 http docs python org library datetime html
  • Chrome Webview 中的 Service Worker 支持

    Android 版 chrome webview 是否支持 Service Worker 如果是 则支持哪个版本 尝试谷歌搜索 但没有找到正确的信息 As per 本公告 https chromereleases googleblog co
  • Opencv 函数只能以 C 代码方式调用,不能以 C++ 方式调用

    我对 Opencv 真的很陌生 按照说明下载并安装 Opencv 2 4 后 我开始编写我的第一个 Opencv 程序 这基本上是网络上教程的副本 include
  • 无法序列化泛型类型

    我正在尝试使用 protobuf net 序列化通用类型 但 protobuf net 说它无法序列化它 As in RuntimeTypeModel Default CanSerialize typeof MyGenericClass l