如何反序列化具有可序列化对象数组的类

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[]。我还建议考虑是否可以使用继承来代替未知类型 - 如果候选类型的数量是有限且已知的,这当然是可能的。

【讨论】:

以上是关于如何反序列化具有可序列化对象数组的类的主要内容,如果未能解决你的问题,请参考以下文章

Jackson - 使用泛型类反序列化

C#中通过XmlSerializer类反序列化多个同名XML元素

将类反序列化为文件并返回列表

Boost 将派生类反序列化为基类指针

如何反序列化包含多维数组的json对象?

如何序列化具有填充数组的对象类型属性的类