【问题标题】:Object to byte array to string and back对象到字节数组到字符串并返回
【发布时间】:2014-07-30 16:45:25
【问题描述】:

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

我能够执行除最后一步之外的每一步。我不断收到以下异常。 “对象必须实现 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;
}

【问题讨论】:

  • 为什么序列化使用ASCII,反序列化使用UTF8?
  • 你有一些奇怪的编码用法,这可能是问题。考虑改用标准方法:对象 -> 字节 -> Base64 -> 字节 -> 对象。
  • 我已将代码更改为 Convert.ToBase64。
  • 你的错误是什么?仍然 OutOfMem 吗?您可以发布用于测试的代码吗?
  • 什么是ObjectToByteArray?您可以发布您的完整(相关)代码吗?

标签: c# string exception bytearray converter


【解决方案1】:

现在可以通过更改此函数 (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;
    }

【讨论】:

    【解决方案2】:

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

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

    按照 cmets 的建议,使用 Convert.ToBase64

    将一个 8 位无符号整数数组转换为使用 base-64 数字编码的等效字符串表示形式。

    及其倒数Convert.FromBase64

    将指定的字符串(将二进制数据编码为 base-64 位)转换为等效的 8 位无符号整数数组。

    【讨论】:

    • 我已根据您的建议更正了代码,但现在我正在处理一个不同的问题。 “对象必须实现 IConvertible。”
    • 好吧,问题仍然是“'System.OutOfMemoryException' 类型的未处理异常”,显然不再是这种情况了 - 如果问题的某些部分没有,那么很难回答匹配其他人 - 因此我要求更新。
    猜你喜欢
    • 2015-05-24
    • 2013-08-04
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2014-09-02
    • 2013-03-03
    相关资源
    最近更新 更多