[C#.NET] 序列化到MemoryStream
前面幾篇有講過如何序列化到檔案
[ADO.NET][C#.NET] 利用序列化+資料繫結 儲存表單參數
[C#.NET][Winform] 序列化表單 - 多國語言應用程式 / Form Serialize - Multiple Languages Application
這回來演練序列化到記憶體,以便讓其他程序直接呼叫,例如使用在Web Service的場景。
序列化:將物件序列化到MemoryStream後,再把它轉成字串取出來。
反序列化:則將字串轉成MemoryStream後,再反序列化
{
private Encoding _Encode = Encoding.UTF8;
public Encoding Encode
{
get { return _Encode; }
set { _Encode = value; }
}
public string ToXmlString(object Model)
{
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer xs = new XmlSerializer(Model.GetType());
xs.Serialize(ms, Model);
return this.Encode.GetString(ms.ToArray());
}
}
public T FromXmlString<T>(string XmlString)
{
using (MemoryStream ms = new MemoryStream(this.Encode.GetBytes(XmlString)))
{
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlTextWriter writer = new XmlTextWriter(ms, this.Encode);
object obj = xs.Deserialize(ms);
if (obj == null)
return default(T);
else
return (T)obj;
}
}
}
接下來,建立單元測試來測試這兩個方法
序列化測試
///A test for ToXmlString
///</summary>
[TestMethod()]
public void ToXmlStringTest()
{
Serialize target = new Serialize();
TestModel Model = new TestModel() { Name = "Yao", Age = 18 };
string expected = "<?xml version=\"1.0\"?>\r\n<TestModel xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <Name>Yao</Name>\r\n <Age>18</Age>\r\n</TestModel>";
string actual;
actual = target.ToXmlString(Model);
Assert.AreEqual(expected, actual);
}{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
]]>
反序列化測試
///A test for FromXmlString
///</summary>
public void FromXmlStringTestHelper<T>()
{
Serialize target = new Serialize();
string XmlString = "<?xml version=\"1.0\"?>\r\n<TestModel xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n <Name>Yao</Name>\r\n <Age>18</Age>\r\n</TestModel>";
TestModel expected = new TestModel() { Name = "Yao", Age = 18 };
TestModel actual;
actual = target.FromXmlString<TestModel>(XmlString);
Assert.AreEqual(actual.Name, expected.Name);
Assert.AreEqual(actual.Age, expected.Age);
}
[TestMethod()]
public void FromXmlStringTest()
{
FromXmlStringTestHelper<GenericParameterHelper>();
}測試結果
若有謬誤,煩請告知,新手發帖請多包涵

Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET
