无法序列化通用类型

斯蒂芬·温克勒

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

如:

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

返回false。我猜我在将我添加MyGenericClass到默认运行时类型模型时做错了。由于类似

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

返回true。

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

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)]标记的情况就是如此

我怀疑如果您这样做:

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

那就可以了

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

'ObjectContent`1'类型无法序列化通用集合

来自分类Dev

API 类型的通用 Gson 序列化

来自分类Dev

XML反序列化通用类型的项目

来自分类Dev

JSON反序列化器继承的通用类型

来自分类Dev

通用模式:无法反序列化JSON数组

来自分类Dev

Alamofire“通用响应对象序列化”无法编译

来自分类Dev

通用反序列化

来自分类Dev

通用类的序列化

来自分类Dev

无法在Web API响应中序列化ByteArraycontent类型

来自分类Dev

Xml序列化无法写入类型为'x'的对象

来自分类Dev

无法通过接口反序列化类型

来自分类Dev

使用WCF DataContract的InvalidDataContractException(“类型无法序列化”)错误

来自分类Dev

Xml序列化错误:无法转换类型的对象

来自分类Dev

无法识别指定的类型反序列化XML错误

来自分类Dev

Web API:无法序列化内容类型的响应正文

来自分类Dev

类型“ Windows.Devices.Geolocation.Geopoint”无法序列化

来自分类Dev

Moshi 1.9.x无法序列化Kotlin类型

来自分类Dev

“类型'lxml.etree._ElementUnicodeResult'无法序列化”

来自分类Dev

无法通过接口反序列化类型

来自分类Dev

XML反序列化无法解析属性类型

来自分类Dev

无法从 String 反序列化 int 类型的值

来自分类Dev

无法序列化从通用特征派生的通用案例类

来自分类Dev

两种类型(通用和Web服务类型)之间的XML序列化

来自分类Dev

通用XML序列化器

来自分类Dev

Genson多态/通用序列化

来自分类Dev

JAXB / Jackson XML通用序列化

来自分类Dev

如何序列化通用列表?

来自分类Dev

Windows通用XML序列化

来自分类Dev

JSON通用集合反序列化