Guest User

uvw

a guest
Jul 28th, 2009
948
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.16 KB | None | 0 0
  1. namespace DataAccess.NHibernate.Types
  2. {
  3.     using System;
  4.     using System.ComponentModel;
  5.     using System.Data;
  6.     using System.IO;
  7.     using System.Xml.Serialization;
  8.     using Dialect;
  9.     using NHibernate;
  10.     using NHibernate.SqlTypes;
  11.     using NHibernate.UserTypes;
  12.  
  13.     internal sealed class XmlSerializerReferenceTo<T>
  14.     {  
  15.         [XmlIgnore]
  16.         public T value;
  17.     }
  18.    
  19.     [Serializable]
  20.     public sealed class XmlSerializedType<T> : IEnhancedUserType
  21.     {
  22.        
  23.         private static readonly XmlSerializer serializer = new XmlSerializer(
  24.                 typeof (T), new[] { typeof (XmlSerializerReferenceTo<INotifyPropertyChanged>) });
  25.  
  26.         private static readonly SqlType[] sqlTypes = new SqlType[] { new SqlXmlType() };
  27.  
  28.         bool IUserType.Equals(object x, object y)
  29.         {
  30.             if (x == null && y == null) {
  31.                 return true;
  32.             }
  33.             if (x == null || y == null) {
  34.                 return false;
  35.             }
  36.             var result = x.Equals(y);
  37.             return result;
  38.         }
  39.  
  40.         public object NullSafeGet(IDataReader data, string[] names, object owner)
  41.         {
  42.             return Unmarshal(NHibernateUtil.String.NullSafeGet(data, names[0]) as string);
  43.         }
  44.  
  45.         public void NullSafeSet(IDbCommand cmd, object value, int index)
  46.         {
  47.             if (value == null) {
  48.                 NHibernateUtil.String.NullSafeSet(cmd, null, index);
  49.                 return;
  50.             }
  51.             NHibernateUtil.String.NullSafeSet(cmd, Marshal(value), index);
  52.         }
  53.  
  54.         public object DeepCopy(object value)
  55.         {
  56.             return value == null ? null : BinarySerializeAndDeserialize(value);
  57.         }
  58.  
  59.         public SqlType[] SqlTypes
  60.         {
  61.             get { return sqlTypes; }
  62.         }
  63.  
  64.         public Type ReturnedType
  65.         {
  66.             get { return typeof (T); }
  67.         }
  68.  
  69.         public bool IsMutable
  70.         {
  71.             get { return false; }
  72.         }
  73.  
  74.         public object Assemble(object cached, object owner)
  75.         {
  76.             return DeepCopy(cached);
  77.         }
  78.  
  79.         public object Disassemble(object value)
  80.         {
  81.             return DeepCopy(value);
  82.         }
  83.  
  84.         public int GetHashCode(object x)
  85.         {
  86.             return x.GetHashCode();
  87.         }
  88.  
  89.         public object Replace(object original, object target, object owner)
  90.         {
  91.             return original;
  92.         }
  93.  
  94.         public object FromXMLString(string xml)
  95.         {
  96.             return Unmarshal(xml);
  97.         }
  98.  
  99.         public string ObjectToSQLString(object value)
  100.         {
  101.             if (value == null) {
  102.                 return null;
  103.             }
  104.             return "'" + Marshal(value) + "'";
  105.         }
  106.  
  107.         public string ToXMLString(object value)
  108.         {
  109.             return Marshal(value);
  110.         }
  111.  
  112.         private static string Marshal(object value)
  113.         {
  114.             if (value == null) {
  115.                 return null;
  116.             }
  117.             using (var writer = new StringWriter()) {
  118.                 serializer.Serialize(writer, value);
  119.                 writer.Flush();
  120.                 return writer.ToString();
  121.             }
  122.         }
  123.  
  124.         private static object Unmarshal(string value)
  125.         {
  126.             if (value == null) {
  127.                 return null;
  128.             }
  129.             using (var reader = new StringReader(value)) {
  130.                 return serializer.Deserialize(reader);
  131.             }
  132.         }
  133.  
  134.         private static T BinarySerializeAndDeserialize(T source)
  135.         {
  136.             var type = typeof(T)
  137.             if (!type.IsSerializable) {
  138.                 throw new ArgumentException("The type must be serializable.", "source");
  139.             }
  140.  
  141.             if (ReferenceEquals(source, null)) {
  142.                 return default(T);
  143.             }
  144.  
  145.             var formatter = new BinaryFormatter();
  146.             using (var stream = new MemoryStream()) {
  147.                 formatter.Serialize(stream, source);
  148.                 stream.Seek(0, SeekOrigin.Begin);
  149.                 return (T) formatter.Deserialize(stream);
  150.             }
  151.         }
  152.     }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment