[C#.NET] 序列化到MemoryStream

  • 8661
  • 0

[C#.NET] 序列化到MemoryStream

前面幾篇有講過如何序列化到檔案

[C#.NET] 利用 泛型方法 重構 反序列化

[C#.NET] 利用 泛型方法 重構 反序列化

[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>();
}

測試結果

image

若有謬誤,煩請告知,新手發帖請多包涵


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

Image result for microsoft+mvp+logo