博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# [Serializable]的作用
阅读量:6543 次
发布时间:2019-06-24

本文共 1695 字,大约阅读时间需要 5 分钟。

如果你做远程方法调用(RPC)时,比如,服务器端有个类A及对象a,客户端需要无视网络的存在,直接调用对象a。这种情况下,就需要把类A设计为可序列化的,那么它的实例a也就可以实例化了。

说得简单点,在服务器的 命名空间中的对象a,肯定不能直接被客户端的命名空间中的一个对象调用,这不可能,对吧。
但是如果你把服务器的对象a中的特征属性(不一定是所有属性)变成xml,传送到客户端,然后客户端用你给的特征属性可以模拟的生成一个对象a。
这个过程就是 rpc,而要把对象a变成xml,就是序列化,反之,把xml变成模拟对象a就是反序列化。
以上是rpc中的序列化。
实际使用中,把app关闭的时候,内存对象可以通过序列化,可以变成可以保存的xml,这样,以便下次app再开得时候,把以前保存过的xml(或者txt等)反序列化成对象。
一句话,序列化就是把内存中对象以一种可以保存的形式保存起来。
需要注意的是:
序列化可以制定序列化整个类,或者 类的某些属性。

 

 

你是想数据持久化吗?

首先,如果Rectangle是你自定义的类的话,必须保证这个类里面的所有状态都是可以储存的,并且要有[Serializable()]标识.
然后你可以用 XmlSerializer类或者 BinaryFormatter类将其逐一序列化.序列化后。
可以将其序列化成XML存进数据库也可以序列化成2进制保存.
==========================
首先,你想保存某个类中的数据,那这个类最好是个实体类,
比如
[Serializable]
[XmlRoot("Rectangle")]
public class Rectangle{
//fields here.
...
public Rectangele(){...}
[XmlElement("Width")]
public int Width{get;set;}
[XmlElement("Length")]
public int Length{get;set;}
}
像这样的类被选择序列化才比较有意义,它要求必须有一个无参数的构造函数.
经过类似下面的方法序列化后,将获得一个文件流
Rectangle rec = new Rectangle{Width = 5,Length = 6};
using (FileStream fs = new FileStream(fileFullName, FileMode.Create, FileAccess.Write, FileShare.Read))
{
XmlSerializer xs = new XmlSerializer(rec.GetType());
//序列化成Xml文件.
xs.Serialize(fs, rec);
//使用文件流
...
}
同样可以序列化成 2进制文件流.:
using (FileStream fs = new FileStream(fileFullName, FileMode.Open, FileAccess.ReadWrite))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, rec);
}
另外,如果你的类用来记录状态,比如是否跟远程主机连接成功,之类的,那么序列化是没有意义的.因为当你反序列化的时候,他的环境已经变了,而以前保存的状态已经不稳定了.
序列化,是记录类中所有可序列化的信息.并可以还原.
另外一个选择呢,就是只记录内容,用内容重新实例化类:
比如
Rectangle rec = new Rectangle{Width = 5,Length = 6};
rec 你只需要在数据库中记录Width = 5,Length = 6
在将来,你可以根据 Width,Length的值重新实例化Rectangle类.
至于集合,可类推

转载于:https://www.cnblogs.com/miaofawei/articles/2150315.html

你可能感兴趣的文章
Makefile 中:= ?= += =的区别【转】
查看>>
使用makecontext实现用户线程【转】
查看>>
Comet:基于 HTTP 长连接的“服务器推”技术
查看>>
BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
查看>>
四种方法校验数组中是否包含某个指定的字符串
查看>>
29、Java并发性和多线程-非阻塞算法
查看>>
安装OpenResty开发环境
查看>>
第0课 从0开始
查看>>
hadoop无法启动DataNode问题
查看>>
java泛型中<?>和<T>区别
查看>>
这里是指推送通知跟NSNotification有区别:
查看>>
用户ID的代码生成
查看>>
win7经常出现“关闭xxxx前您必须关闭所有会话框”
查看>>
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>
MongoDB 自己定义函数
查看>>
Summary Day30
查看>>
逆向输出回环数组
查看>>
高清摄像头MIPI CSI2接口浅解【转】
查看>>
C# CancellationTokenSource和CancellationToken的实现
查看>>
PCIE BAR空间
查看>>