如何使用可序列化对象的数组反序列化类

时间:2014-12-25 07:23:19

标签: c# deserialization protobuf-net

我有一些带有一些序列化类的数组(命名为它的元素)。我想序列化这个类,然后反序列化它。但反序列化很困难。

因为在序列化之前我不知道我的数组的元素类型,所以创建两个数组匹配元素数组。在一个(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);
              }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

对于&#34;我只知道运行时的类型&#34;问题,请查看Serializer.NonGeneric,其中包含您使用Type所需的所有方法。非通用API也是v2 API上的主要API,即TypeModel。已经注意到字符串编码问题;如果你需要字符串,应该使用base-64,但我个人使用byte[]。我还建议考虑是否可以使用继承而不是未知类型 - 如果候选类型的数量是有限且已知的话,这肯定是可能的。