我正在試圖序列List<Tuple<string, Type, object>>
如果出現以下錯誤消息:沒有串行類型定義:System.Type的protobuf網錯誤消息:沒有串行類型定義:System.Type的
我都嘗試,只是序列化上述集合或序列化與protoMember定義的集合具有相同集合的類。兩者都會導致相同的錯誤消息。
這是不支持的類型嗎?我認爲它是支持的,我忽略了別的東西,但也許我不正確?
感謝任何指針可以幫助解決這個...
我正在試圖序列List<Tuple<string, Type, object>>
如果出現以下錯誤消息:沒有串行類型定義:System.Type的protobuf網錯誤消息:沒有串行類型定義:System.Type的
我都嘗試,只是序列化上述集合或序列化與protoMember定義的集合具有相同集合的類。兩者都會導致相同的錯誤消息。
這是不支持的類型嗎?我認爲它是支持的,我忽略了別的東西,但也許我不正確?
感謝任何指針可以幫助解決這個...
編輯:
爲Type
序列化的支持包括在R580
protobuf網旨在系列化你數據,而不是您的實施; Type
是一個實現細節。嚴格地說,添加並不是非常困難(一些特定於實現的細節已經基本上已經通過彙編限定名來存儲Type
信息),但是:它不是關鍵場景,並且在許多情況下方法是而不是我鼓勵你序列化 - 協議緩衝區的全部重點是你可以在任何平臺上加載數據,而版本容差是一個關鍵特性。存儲Type
信息違反了這些。
還應當指出的是,大多數其他串行(也許除了BinaryFormatter
,這已經打破了平臺/版本容忍每個規則)將也拒絕序列化Type
; XmlSerializer
,DataContractSerializer
,JavaScriptSerializer
等全部爲這種情況拋出一個異常(我只是檢查它們)。
此外: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; }
}
感謝您的意見。但你將如何去序列化這種收集?我需要通過只允許傳輸字節數組的消息總線發送它。將Type轉換爲字符串,然後將其轉換回Type類型選項?我同意你的對象類型,我想我之前問過你,並且指出了我的DynamicType特性。 –
@Freddy事實上,最簡單的事情就是使用'.AssemblyQualifiedName'和'Type.GetType(string)'來存儲'string,string,object'。如果你想得到*真的*異乎尋常的,你可以爲'Type'增加一個* surrogate *(protobuf-net支持這個)。在技術層面上,我可以直接支持它,而不會有太多的痛苦,但是看起來好像我會讓人們用火箭筒輕鬆地在腳下自己射擊。 –
感謝您的指點,真的很感激。按照給定的平臺和版本獨立性是期望的目標,保持圖書館聽起來是合理的。我已經假設你在回答中描述了你通過程序集限定名存儲類型,否則我可能不知道解串器如何在沒有類型信息的幫助下處理其任務。但是我可能完全不在,因爲我根本沒有看過你的源代碼。 –
見更新的答案;這實際上包含在以後的版本 –