我不清楚什么时候应该使用序列化/反序列化技术
谁能给我一些基本的用例场景?
序列化是将对象转换为某种编码表示以将其从一个地方移动到另一个地方的过程。通常,这是将对象转换为字节数组或 XML 字符串之类的过程,但如果您愿意,也可以序列化为其他格式。
序列化最常见的用途是当您需要跨进程、机器或更准确地说是 AppDomain 边界移动对象时。因此,如果要将对象从服务器 A 发送到服务器 B,则必须在服务器 A 上序列化该对象,然后将该对象的编码表示发送到服务器 B,并让服务器 B 反序列化该对象以便使用它在另一端。
并非所有对象都易于序列化——例如,如果将指针发送到另一台服务器,则在内存中具有指向服务器上某个位置的指针的对象可能没有意义。在这种情况下,您必须编写自己的自定义逻辑来确定如何处理该指针。也许你根本不会序列化你的对象的那个属性......也许你也会序列化指针指向的对象——这将取决于你。这就是为什么序列化并不总是容易或自动的。
几个明显的例子是当您需要跨进程边界传输类的实例时(例如,当使用 WCF 或其他一些远程通信技术时)或者您希望将实例持久保存到流(可能是文件)中。
序列化只是表示处于序列化状态的对象实例的艺术,允许它们随时重新创建为对象类型。两个简单的用例是简单地将对象写入文件并将它们写下来Stream
(用于网络通信,或进程间通信,或其他)。
例如,如果您想像这样传输一个简单的 DTO:
public class TestDto
{
public string TestText { get; set; }
public string MoreText { get; set; }
}
..您将添加[Serializable]
并使用诸如 之类的东西BinaryFormatter
以便能够从 . 的另一端读取它NetworkStream
。
默认情况下,您不能简单地将对象实例写入任何形式的Stream
文件或文件,并使其在另一端保持不变。当然,有一些库可以帮助解决这个问题(例如 WCF),它们将在[Serializable]
内部进行转换(对于类)。
(我不确定你为什么有wpf,但序列化绝对不是 WPF 特有的)