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'字符串'不包含'反序列化'的定义
我不知道我做错了什么.关于如何解决它的任何想法?
扩展方法的第一个参数是您正在操作的对象.在这种情况下,它是字节数组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)
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |