对象到字节数组到字符串和后面

时间:2014-06-10 03:06:09

标签: c# string exception bytearray converter

我有一个特定的要求,即将对象转换为字节数组,然后转换为字符串。然后我需要从字符串返回到字节数组然后再对象。

除了最后一步,我能够执行每一步。我一直得到以下异常。 "对象必须实现IConvertible。"

对象实际上在数据方面非常小。

以下是使用的代码:

private Object ToSafeObjectFromString(String SafeString,Type ObjectType)
{
    //This line throws the exception
    byte[] BufferArray = Convert.FromBase64String(SafeString);
    return Convert.ChangeType(CustomByteArrayToObject(BufferArray), ObjectType);
}

public static object CustomByteArrayToObject(byte[] arrBytes)
{
    MemoryStream memStream = new MemoryStream();
    BinaryFormatter binForm = new BinaryFormatter();
    memStream.Write(arrBytes, 0, arrBytes.Length);
    memStream.Seek(0, SeekOrigin.Begin);
    object obj = (object)binForm.Deserialize(memStream);
    return obj;
}
private String ToSafeStringFromObject(Object Object)
{
    byte[] ByteArray = ObjectToByteArray(Object);
    String ReturnValue = Convert.ToBase64String(ByteArray);
    return ReturnValue;
}

2 个答案:

答案 0 :(得分:4)

您使用ASCII编码进行序列化,但使用UTF-8编码进行反序列化,看起来不对称。

不要使用文本编码进行二进制序列化,这具有未定义的行为:您使用的二进制数组根本没有编码,它是二进制数据。

根据评论中的建议,使用Convert.ToBase64

  

将8位无符号整数数组转换为以64位数编码的等效字符串表示形式。

及其互惠Convert.FromBase64

  

将指定的字符串转换为等效的8位无符号整数数组,该字符串将二进制数据编码为基数为64的数字。

答案 1 :(得分:0)

现在可以通过更改此函数(ToSafeObjectFromString)来实现。

    public Object ToSafeObjectFromString(String SafeString, Type ObjectType)
    {
        var tmp = Convert.FromBase64String(SafeString);

        MemoryStream memStream = new MemoryStream();
        BinaryFormatter binForm = new BinaryFormatter();

        memStream.Write(tmp, 0, tmp.Length);
        memStream.Seek(0, SeekOrigin.Begin);

        object obj = (object)binForm.Deserialize(memStream);

        return obj;
    }