C#实现PHP函数serialize()与unserialize()

在日常开发当中,不同平台之间相互通信是比较常见的,比如.net和php相互通信。你可能在使用Webservice,也可能仅仅需要处理对方传递过来的一些数据。如果使用的是一些标准数据格式像XML,Json,那处理起来就比较容易了,因为各方都有类似的实现。但是这种数据格式比较非主流那该怎么办那?

 

例如你需要在.net平台处理PHP函数serialize()序列化后的字符串。又或者你想要用PHP函数 unserialize() 反序列化C#序列化的对象。那么,这个时候,Sharp Serialization Library 可以帮助你。

囧,废话好多啊,下面正文开始。

Sharp Serialization Library 介绍

Sharp Serialization Library serializes and deserializes primitives, ArrayLists and Hashtables, compatible with PHP serialize(). Use it for SOAP/Web Services communications where Hashtables cannot be passed otherwise, or saving to a file readable by php.

Sharp Serialization Library 功能

反序列化PHP函数 serialize()序列化后的字符串。
把对象序列化为PHP函数 unserialize() 可用的字符串。

Sharp Serialization Library 实例

//来自 http://endless.im
//原文 http://endless.im/archives/csharp-sharpserializationlibrary-php-serialize.html
//C#反序列化多维数组的例子
//Str是PHP函数 serialize()序列化后的字符串
//像这样a:5:{i:0;a:8:{i:0;s:1:"0";s:1:"u";s:1:"0";i:1;s:1:...
ArrayList al = (ArrayList)serializer.Deserialize(Str); 
	for (int i = 0; i < al.Count; i++)
	{
		Hashtable ht = (Hashtable)al[i]; 
		//do something
	}


//C#反序列化单维数组的例子
ArrayList al = (ArrayList)serializer.Deserialize(Str); 
	for (int i = 0; i < al.Count; i++)
	{
		Hashtable ht = (Hashtable)al[i]; 
		//do something
	}


//C#把对象序列化为PHP unserialize()可用字符串
Hashtable ht = new Hashtable();
//single string
ht[this.ssKeyTextBox.Text] = this.ssValueTextBox.Text;
ArrayList al = new ArrayList(3);
al.Add(this.alValue1TextBox.Text);
al.Add(this.alValue2TextBox.Text);
al.Add(this.alValue3TextBox.Text);
//ArrayList
ht[this.alKeyTextBox.Text] = al;
int i = Int32.Parse(this.intValueTextBox.Text);
ht[this.intKeyTextBox.Text] = i;//int
//Serialize the Hashtable
string stSerializedText = this.serializer.Serialize(ht);
this.serializeTextBox.Text = stSerializedText;

Sharp Serialization Library 下载

项目官方地址 http://csphpserial.sourceforge.net/

另附赠C#获取 Unix时间戳

//要注意转换为本地时区
DateTime dtstart = new DateTime(1970, 1, 1);
dtstart =TimeZone.CurrentTimeZone.ToLocalTime(dtstart);
TimeSpan syncDate = syncDate.Subtract(dtstart);
string unixDate = syncDate.Ticks.ToString();
unixDate = unixDate .Substring(0, unixDate.Length - 7);

 

此文同时发布在:http://endless.im
原文地址:http://endless.im/archives/csharp-sharpserializationlibrary-php-serialize.html

转载于:https://www.cnblogs.com/wuya/archive/2010/09/26/1835410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要正确实现对话框类的 `Serialize` 函数以保存和加载其状态,您需要按照以下步骤进行操作: 1. 在对话框类的头文件中声明 `Serialize` 函数。 ```cpp class CMyDialog : public CDialog { public: // ... virtual void Serialize(CArchive& ar); }; ``` 2. 在对话框类的源文件中实现 `Serialize` 函数。在该函数中,您可以存储和加载对话框中的控件数据。 ```cpp void CMyDialog::Serialize(CArchive& ar) { CDialog::Serialize(ar); // 调用基类的 Serialize 函数 if (ar.IsStoring()) { // 保存控件数据 ar << m_EditText; ar << m_CheckBox; // ... } else { // 加载控件数据 ar >> m_EditText; ar >> m_CheckBox; // ... } } ``` 在上述示例中,`m_EditText` 和 `m_CheckBox` 是对话框类中的两个控件成员变量。您可以根据实际情况添加其他需要保存和加载的控件数据。 3. 在文档类的 `Serialize` 函数中调用对话框类的 `Serialize` 函数。 ```cpp void CMyDoc::Serialize(CArchive& ar) { // ... if (ar.IsStoring()) { // 保存对话框状态 int numDialogs = m_dialogs.size(); ar << numDialogs; for (int i = 0; i < numDialogs; i++) { if (m_dialogs[i] != nullptr) { m_dialogs[i]->Serialize(ar); // 保存对话框状态 } } } else { // 加载对话框状态 int numDialogs; ar >> numDialogs; for (int i = 0; i < numDialogs; i++) { CMyDialog* pDialog = new CMyDialog(); pDialog->Serialize(ar); // 加载对话框状态 m_dialogs.push_back(pDialog); } } // ... } ``` 在上述示例中,假设 `m_dialogs` 是文档类中存储对话框指针的容器。在保存时,遍历容器调用每个对话框的 `Serialize` 函数进行保存。在加载时,根据存档中保存的对话框状态创建新的对话框实例,并加载其状态。 通过以上步骤,您可以正确实现对话框类的 `Serialize` 函数以保存和加载其状态。 希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值