如何反序列化具有可序列化对象数组的类
Posted
技术标签:
【中文标题】如何反序列化具有可序列化对象数组的类【英文标题】:How to deserialize class with array of serializable object 【发布时间】:2014-12-25 07:23:19 【问题描述】:我有一个带有一些序列化类数组的类(命名为元素)。我想序列化这个类,然后反序列化它。但是反序列化很困难。
因为在序列化之前我不知道数组元素的类型,所以创建了两个与元素数组匹配的数组。在一个 (typeOfElements
) 中保留元素的类型,在另一个 (serializedElemnt
) 中保留序列化的元素字符串。但我不知道反序列化后如何创建我的主要元素数组。如何将类型转换为类来创建我的主数组?
[ProtoContract]
class MyClass
.
.
public MyClass()
object[] elements;
[ProtoMember(1)]
string[] SerilizedElements;
[ProtoMember(2)]
string[] TypeOfElements;
[ProtoBeforeSerialization]
void initBeforeSerilize()
TypeOfElements = new string[elements.Length];
SerilizedElements = new string[elements.Length];
for (int i = 0; i < elements.Length; i++)
TypeOfElements[i] = elements[i].GetType().ToString();
using (MemoryStream ms = new MemoryStream())
Serializer.Serialize(ms, elements[i]);
SerilizedElements[i] = Encoding.UTF8.GetString(ms.ToArray());
[ProtoAfterDeserialization]
void initAfterSerilize()
for (int i = 0; i < SerilizedElements.Length; i++)
Type t = Type.GetType(TypeOfElements[i]);
using(MemoryStream ms=new MemoryStream(Encoding.ASCII.GetBytes(SerilizedElements[i])))
//I don't know how to write this line
elements[i]=Serializer.Deserialize<t>(ms);
【问题讨论】:
我什至不知道是否有可能做你想做的事。但我绝对不认为你应该为你的序列化对象使用字符串。您正在尝试将原始二进制数据编码为 UTF8,这可能会失败。因此,可以尝试使用字节数组数组代替字符串数组,并通过编码和解码丢弃所有内容。 (而且你在使用 UTF8 编码和使用 ASCII 解码时也有一个错误——我认为两者都行不通,而且使用两种不同的编码肯定行不通。) 关于编码你是对的。在主项目中,我想在两台带网络的计算机之间建立连接。我有几个具有不同输入参数的函数,我想从另一台计算机调用它们。这个数组是函数输入 【参考方案1】:对于“我只知道运行时的类型”问题,请查看 Serializer.NonGeneric
,它包含您想要使用 Type
的所有方法。非通用 API 也是 v2 API 上的主要 API,即 TypeModel
。字符串编码问题已经被注意到;如果你需要字符串,应该使用 base-64,但我个人会使用byte[]
。我还建议考虑是否可以使用继承来代替未知类型 - 如果候选类型的数量是有限且已知的,这当然是可能的。
【讨论】:
以上是关于如何反序列化具有可序列化对象数组的类的主要内容,如果未能解决你的问题,请参考以下文章