如何扩展字符串以反序列化二进制数据

Bla*_*ano 2 c# extension-methods

我正在使用自己的扩展方法将字符串(和更多数据类型)序列化为具有自定义二进制格式的文件(外部,我无法修改该格式).我的方法是:

public static byte[] Serialize(this string str)
{
    if (str.Length > short.MaxValue)
        throw new ArgumentOutOfRangeException("str", "Max length allowed is " + short.MaxValue.ToString());
    List<byte> data = new List<byte>();
    data.Add(0);
    data.Add(0);
    if (str != null)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(str);
        data.AddRange(buffer);
        data[0] = (byte)(buffer.Length % 256);
        data[1] = (byte)((buffer.Length / 256) >> 8);
    }
    return data.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

string str1 = "Binary String";
byte[] data = str1.Serialize();
Run Code Online (Sandbox Code Playgroud)

结果是

data = { 13, 0, 66, 105, 110, 97, 114, 121, 32, 83, 116, 114, 105, 110, 103 }
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试添加另一个扩展方法,以便在从这些文件中读取时进行反序列化:

public static void Deserialize(this string str, byte[] data)
{
    if (data == null || data.Length < 2)
    {
        str = null;
    }
    else
    {
        short length = (short)(data[0] + (data[1] << 8));
        if (data.Length != length + 2)
            throw new ArgumentException("Invalid data", "data");
        str = Encoding.UTF8.GetString(data, 2, length);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我试试这个:

string str2 = null;
str2.Deserialize(data);
Run Code Online (Sandbox Code Playgroud)

str2的预期结果是

"二进制字符串"

实际结果是

空值

但是,在逐步调试时,strinside Deserialize()会在行中获取正确的值str = Encoding.UTF8.GetString(data, 2, length);.

还试过这个:

string str3 = string.Deserialize(data);
Run Code Online (Sandbox Code Playgroud)

但它不编译,错误信息是

错误1'字符串'不包含'反序列化'的定义

我不知道我做错了什么.关于如何解决它的任何想法?

Dav*_*idG 6

扩展方法的第一个参数是您正在操作的对象.在这种情况下,它是字节数组data.返回类型是您想要填充到字符串变量中的类型.因此,该Deserialize方法的签名应为:

public static string Deserialize(this byte[] data)
Run Code Online (Sandbox Code Playgroud)

同样在方法内部,你需要返回字符串值,这样你的完整方法应该是(注意我非常简化):

public static string Deserialize(this byte[] data)
{
    if (data == null || data.Length < 2)
        return null;

    short length = (short)(data[0] + (data[1] << 8));
    if (data.Length != length + 2)
        throw new ArgumentException("Invalid data", "data");

    return Encoding.UTF8.GetString(data, 2, length);
}
Run Code Online (Sandbox Code Playgroud)

你这样使用它:

string str1 = "Binary String";
byte[] data = str1.Serialize();
string str2 = data.Deserialize();
Run Code Online (Sandbox Code Playgroud)