Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# Protobuf网络错误消息:没有为类型定义序列化程序:System.type_C#_Protocol Buffers_Protobuf Net_System.type - Fatal编程技术网

C# Protobuf网络错误消息:没有为类型定义序列化程序:System.type

C# Protobuf网络错误消息:没有为类型定义序列化程序:System.type,c#,protocol-buffers,protobuf-net,system.type,C#,Protocol Buffers,Protobuf Net,System.type,尝试序列化列表时,我收到以下错误消息:没有为类型定义序列化程序:System.type 我尝试了这两种方法,只是序列化上面的集合,或者序列化一个具有定义为protoMember的相同集合的类。两者都会导致相同的错误消息 这是不受支持的类型吗?我认为它是被支持的,我忽略了其他一些东西,但也许我是错的 感谢所有可能有助于解决此问题的指针…编辑: r580中包括对类型序列化的支持 protobuf net旨在序列化您的数据,而不是您的实现类型是一个实现细节。严格来说,添加并不困难(一些特定于实现的细

尝试序列化
列表时,我收到以下错误消息:没有为类型定义序列化程序:System.type

我尝试了这两种方法,只是序列化上面的集合,或者序列化一个具有定义为protoMember的相同集合的类。两者都会导致相同的错误消息

这是不受支持的类型吗?我认为它是被支持的,我忽略了其他一些东西,但也许我是错的

感谢所有可能有助于解决此问题的指针…

编辑:

r580中包括对
类型
序列化的支持


protobuf net旨在序列化您的数据,而不是您的实现<代码>类型
是一个实现细节。严格来说,添加并不困难(一些特定于实现的细节实际上已经通过程序集限定名存储了
Type
info),但是:这不是一个关键场景,在许多方面,我不鼓励您进行序列化—协议缓冲区的全部要点是您可以在任何平台上加载数据,版本公差是一个关键特性。存储
类型
信息违反了这两个原则

还应该注意的是,大多数其他序列化程序(可能除了已经违反了平台/版本公差的所有规则的
二进制格式化程序
)也将拒绝序列化
类型
XmlSerializer
DataContractSerializer
JavaScriptSerializer
etcall为此场景引发异常(我刚刚检查了它们)

另外:
object
甚至更不受支持,除非您使用
DynamicType
功能


下面是如何通过
Type
上的代理完成的:

using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Runtime.Serialization;

static class Program
{
    public static void Main(string[] args)
    {
        // register a surrogate for Type
        RuntimeTypeModel.Default.Add(typeof(Type), false)
                                .SetSurrogate(typeof(TypeSurrogate));
        // test it
        var clone = Serializer.DeepClone(new Foo { Type = typeof(string) });
    }
}

[ProtoContract]
class TypeSurrogate
{
    [ProtoMember(1)]
    public string AssemblyQualifiedName { get; set; }
    // protobuf-net wants an implicit or explicit operator between the types
    public static implicit operator Type(TypeSurrogate value)
    {
        return value==null ? null : Type.GetType(value.AssemblyQualifiedName);
    }
    public static implicit operator TypeSurrogate(Type value)
    {
        return value == null ? null : new TypeSurrogate {
            AssemblyQualifiedName  = value.AssemblyQualifiedName };
    }
}

[DataContract]
public class Foo
{
    [DataMember(Order=1)]
    public Type Type { get; set; }
}

谢谢你的评论。但是,您将如何对此类集合进行序列化?我需要通过只允许传输字节数组的消息总线发送它。将类型转换为字符串,然后将其转换回类型是一个选项吗?我同意你关于对象类型的看法,我想我之前问过你,你指给我看DynamicType功能。@Freddy实际上,最简单的方法是使用
.AssemblyQualifiedName
Type.GetType(string)
存储
字符串、字符串、对象。如果你想变得真正有异国情调,你可以为
类型添加一个代理(protobuf-net支持)。在技术层面上,我可以直接支持它,而不需要太多的痛苦,但看起来我会让人们射中自己的脚变得非常容易。。。用火箭筒。谢谢你的指点,真的很感激。考虑到平台独立性和版本独立性是理想的目标,保留库似乎是合理的。我已经假设您在回答中描述的是通过程序集限定名存储类型,否则我可能不理解反序列化程序在没有类型信息帮助的情况下如何处理其任务。最后一个问题:我想在包含protoMember集合
列表的类中嵌入从类型到字符串的转换,然后再将字符串转换回类型。在序列化时,这很容易,因为我可以在构造函数中进行转换。但是,有没有办法在反序列化时隐式地转换回类型?有没有一种方法可以指定在反序列化集合之后但在返回反序列化的类对象之前调用的方法,以便可以执行操作?@Freddy在大多数情况下,当您反序列化时,您会告诉它您想要的类型,或子对象,它通过属性信息等知道类型。只有在DynamicType中它事先不知道,并且为此它使用AssemblyQualifiedName等(至少在默认情况下是这样)。对于最后一个问题,这就是代理的作用——但这有点棘手,因为
Tuple
已经有了一种特殊的处理风格。为
类型添加代理可能更容易。。。2秒…见更新的答案;这实际上包含在以后的构建中