我正在尝试使用protobuf-net v2序列化/反序列化包含hashtable属性的自定义类。
[ProtoContract]
public class MyClass
{
[ProtoMember(1)]
public Hashtable MyHashTable { get; set; }
}
当我调用Serializer.Serialize(...)异常时出现: 没有为类型定义的序列化程序:System.Collections.Hashtable
我尝试修改:
[ProtoContract]
public class MyClass
{
[ProtoMember(1, DynamicType = true)]
public Hashtable MyHashTable { get; set; }
}
但我有另一个例外: 不期望类型,也无法推断合同:System.Collections.DictionaryEntry
也许有人知道如何序列化哈希表?
答案 0 :(得分:1)
感谢所有帮助过我的人。这是我的解决方案。我知道这不是最好的方式,但也许对于那些可以接受的人来说。
[ProtoContract]
public class HashtableTestClass
{
private string inputParametersBase64 = string.Empty;
private Hashtable myHashTable;
public Hashtable MyHashtable
{
get { return myHashTable; }
set { myHashTable = value; }
}
[ProtoMember(1)]
public string InputParametersBase64
{
get
{
if (myHashTable == null)
return string.Empty;
return HashtableToBase64(myHashTable);
}
set
{
inputParametersBase64 = value;
if (!string.IsNullOrEmpty(inputParametersBase64))
{
try
{
myHashTable = Base64ToHashtable(inputParametersBase64);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
public static Hashtable Base64ToHashtable(string s)
{
MemoryStream stream = new MemoryStream(Convert.FromBase64String(s), false);
IFormatter formatter = new BinaryFormatter();
return (Hashtable)formatter.Deserialize(stream);
}
public static string HashtableToBase64(Hashtable hashtable)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, hashtable);
stream.Close();
return Convert.ToBase64String(stream.ToArray());
}
}