NET序列化と逆順化

15211 ワード

プロシージャとアンチシーケンス化の目的は、異なるプロセス、アプリケーション、サービス間の伝達、オブジェクトの保存とステータスの復元など、オブジェクトの伝達と耐久性を解決するためである.
      .ネットの環境の下で提供する序列化の方式は3.5バージョンまで、バイナリがあって、SOAP、XML、DataContract、JavaScriptなど、ソースのはJson.netなどがあります.もちろん、自分の手動反射によって実現されるものもあります.例えば、Member Infoを利用したり、FormaterServices(バイナリ、SOAPなどはFormater Servicesをカプセル化した操作です.).以上のいくつかの中で、プログレッシブ処理の対象には異なる要求があります.バイナリ、SOAP、XML方式の要求対象は、属性表記がプログレッシブである必要があります.DataContract、JavaScriptは、強制的な要求はありませんが、Serialzable、NonSerialized、OnSerializing、OnDeserizazableなどの属性はまだあります.JavaScript格化器の実行中に有効です.
ps:プログレッシブとアンチプログレッシブのオブジェクトは元のオブジェクトのコピーであり、参照ではありません.封送値の対象は、順序付けが必要です.
PS:プロパティマークAttributeはコンパイル時に直接バンド構造パラメータを構築するAttributeの例をメタデータおよびILに書き込みます.ですから、反射して取得したのはすべてAttributeの例です.Type.Is Definedで属性が表記されているかどうかを判断することができます.この効率が一番高いです.もちろん、Get CutstomAttribute(例を取得して動作可能)/Get CutomAttributeData(反射例のみを取得するが、動作しない)によってもよい.
     序文化と逆秩序化の過程で,序文化過程に対して他の特殊な処理操作を行うことができる.次の例のコメントを見てください.
 [Serializable]
private class Demo {

[NonSerialized]
private string name;
public string Name
{
get { return name; }
set { name = value; }
}

[OnSerializing] //
private void OnSerializing(StreamingContext context) { }
[OnSerialized] //
private void OnSerialized(StreamingContext context) { }

[OnDeserializing] //
private void OnDeserializing(StreamingContext context) { }
[OnDeserialized] //
private void OnDeserialized(StreamingContext context) { }
}
 
 1.マイクロソフトは直接的に序列化と反秩序化の実現を提供します.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Xml.Serialization;
using System.Web;

namespace EFTool.Test
{
///<summary>
/// ( ,SOAP,XML,DataContract )
/// SOAP 3.5 , XmlSerializer,DataContractSerializer.
/// FileStream,MemoryStream
/// ( ), MarshalbyRefObject( )
///</summary>
public static class SerializationHelper
{
#region Serializable
///<summary>
/// ( )
///</summary>
///<param name="graph"> Serializable</param>
///<returns></returns>
public static Stream SerializeByBinary(object graph)
{
MemoryStream memoryStream = new MemoryStream();
IRemotingFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, graph); // ( , FileStream )
//Byte[] arrGraph = memoryStream.ToArray(); // 64 ( , )
return memoryStream;

}

///<summary>
///
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph" Serializable></param>
///<returns></returns>
public static T DeserializeByBinary<T>(Stream stream)
{
stream.Position = 0;
IRemotingFormatter formatter = new BinaryFormatter();
return (T)formatter.Deserialize(stream);
}
#endregion

#region StreamingContextStates.Clone Serializable
///<summary>
/// ( )
///</summary>
///<param name="graph"></param>
///<returns></returns>
public static Stream DeepCloneSerializeByBinary(object graph)
{
MemoryStream memoryStream = new MemoryStream();
IRemotingFormatter formatter = new BinaryFormatter();
//
formatter.Context = new StreamingContext(StreamingContextStates.Clone);
formatter.Serialize(memoryStream, graph);
return memoryStream;

}

///<summary>
///
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static T DeepCloneDeserializeByBinary<T>(Stream stream)
{
stream.Position = 0;
IRemotingFormatter formatter = new BinaryFormatter();
formatter.Context = new StreamingContext(StreamingContextStates.Clone);
return (T)formatter.Deserialize(stream);
}
#endregion

#region SOAP ( ) Serializable
///<summary>
/// SOAP ( )
///</summary>
///<param name="graph"></param>
///<returns></returns>
public static Stream SerializeBySoap(object graph)
{
MemoryStream memoryStream = new MemoryStream();
IRemotingFormatter formatter = new SoapFormatter();
formatter.Serialize(memoryStream, graph);
return memoryStream;

}

///<summary>
/// SOAP
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static T DeserializeBySoap<T>(Stream stream)
{
stream.Position = 0;
IRemotingFormatter formatter = new SoapFormatter();
return (T)formatter.Deserialize(stream);
}
#endregion

#region XML SOAP-> Serializable
///<summary>
/// XML (XML ,XML )
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static Stream SerializeByXml<T>(object graph)
{
MemoryStream memoryStream = new MemoryStream();
XmlSerializer formatter = new XmlSerializer(typeof(T));
formatter.Serialize(memoryStream, graph);
return memoryStream;
}

///<summary>
/// (XML)
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static T DeserializeByXml<T>(Stream stream)
{
stream.Position = 0;
XmlSerializer formatter = new XmlSerializer(typeof(T));
return (T)formatter.Deserialize(stream);
}

#endregion

#region DataContractSerialzer Serializable
///<summary>
/// DataContractSerialzer
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static Stream SerializeByDataContract<T>(object graph)
{
MemoryStream memoryStream = new MemoryStream();
DataContractSerializer formatter = new DataContractSerializer(typeof(T));
formatter.WriteObject(memoryStream,graph);
return memoryStream;
}

///<summary>
/// DataContractSerialzer
///</summary>
///<typeparam name="T"></typeparam>
///<param name="graph"></param>
///<returns></returns>
public static T DeserializeByDataContract<T>(Stream stream)
{
stream.Position = 0;
DataContractSerializer formatter = new DataContractSerializer(typeof(T));
return (T)formatter.ReadObject(stream);
}
#endregion

}

}
 
FormaterServicesの反射を利用して実現しました.
 BlogCategory cate = new BlogCategory();
cate.CateID = 1;
cate.CateName = "llj";
cate.CreateTime = DateTime.Now;
cate.SortID = 10;
cate.BlogArticle.Add(new BlogArticle()
{
UserID=20,
ArticleID = 1,
BlogCategory_CateID = 1,
Title = "love",
CreateTime = DateTime.Now

});

//
MemberInfo[] members = FormatterServices.GetSerializableMembers(cate.GetType());
object[] membersValues = FormatterServices.GetObjectData(cate, members);

for (int i = 0; i < members.Length; i++)
{
// XML/JSON ,
//members[i].Name
//membersValues[i]
}

//
BlogCategory cate2 = (BlogCategory)FormatterServices.GetUninitializedObject(typeof(BlogCategory));
//BlogCategory cate2 = new BlogCategory();
FormatterServices.PopulateObjectMembers(cate2, members, membersValues);
もちろんこれは便利な方法であり、手動反射で実現することもできます.手動で実現するには、性能と複雑なタイプの処理を考慮しなければなりません.例えばナビゲーションクラスに会ったり、汎型の集合があったり、Nullable<T>という汎型の値の種類は、一般的に非空値の種類を処理するために用いられます.前節で紹介したCLRのいくつかの反射性能の例 同じ目的を達成することができます.