我有一个特定的要求,即将对象转换为字节数组,然后转换为字符串。然后我需要从字符串返回到字节数组然后再对象。
除了最后一步,我能够执行每一步。我一直得到以下异常。 "对象必须实现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;
}
答案 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;
}