My class is
[Serializable]
public class Class1 : ISerializable
{
public int Id { get; set; }
public string Name { get; set; }
public Class1() { }
Class1(SerializationInfo info, StreamingContext context)
{
Id = (int)info.GetValue(nameof(Id), typeof(int));
Name = (string)info.GetValue(nameof(Name), typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(Id), Id);
info.AddValue(nameof(Name), Name);
}
public override string ToString()
{
return $"{Id}; {Name}";
}
}
我的Web API序列化这个类,然后作为字节数组发送;
public class DataController : ApiController
{
public byte[] Get()
{
Class1 class1 = new Class1()
{
Id = 100,
Name = "Name"
};
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, class1);
return memoryStream.ToArray();
}
}
}
在我的WinForms应用程序,我试图得到这个序列化类和复活它,
private async void Button1_Click(object sender, EventArgs e)
{
HttpClient httpClient = new HttpClient();
Uri uri = new Uri(textBox1.Text);
var bytes = await httpClient.GetByteArrayAsync(uri);
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream(bytes))
{
var class1 = binaryFormatter.Deserialize(memoryStream) as Class1;
richTextBox1.Text = class1.ToString();
}
}
但是方法Deserialize
抛出了一个异常:"输入流不是有效的二进制格式。&">
我做错了什么?
我想在服务器和客户端之间交换一个对象。不知怎么的,我做错了。首先,不需要手动序列化对象。我们需要的是直接发送对象,而不是它的序列化字节。ASP。根据我的理解,NET MVC为我们照顾序列化。所以,API方法应该是
public Class1 Get()
{
return new Class1()
{
Id = 100,
Name = "Name"
};
}
有一个名为Microsoft.AspNet.WebApi.Client
的包,它支持格式和内容协商到System.Net.Http
。称为System.Net.Http.Formatting
的程序集是包的一部分,它既执行序列化,也执行反序列化。当我们创建一个新的web应用程序时,Visual Studio会自动将这个包安装到项目中。
但是,对于Windows Forms
项目,它必须通过NuGet包管理器手动安装。包安装将添加2个程序集到项目中,Newtonsoft.Json
和System.Net.Http.Formatting
。然后,剩下的就很简单了
private void GetButton_Click(object sender, EventArgs e)
{
HttpClient httpClient = new HttpClient();
Uri uri = new Uri(textBox1.Text);
var content = httpClient.GetAsync(uri).Result.Content;
var class1 = content.ReadAsAsync<Class1>().Result;
richTextBox1.Text = class1.ToString();
}
Bob是你叔叔!