• Авторизация


Сериализуем несериализуемое ;) 08-11-2007 16:08 к комментариям - к полной версии - понравилось!


Так сложилось что в одном из моих проектов используется XmlSerializer для передачи значений между клиентом и сервером. И всё было бы прекрасно пока не понадобилось передвавать объекты не поддерживаемые XmlSerializer-ом... На помощь пришла универсальная обёрточка ;)
    1 using System;
    2 using System.IO;
    3 using System.Runtime.Serialization.Formatters.Binary;
    4 using System.Xml;
    5 using System.Xml.Schema;
    6 using System.Xml.Serialization;
    7 
    8 namespace dimzon.Utils
    9 {
   10     [Serializable]
   11     public sealed class XmlSerializable<T>: IXmlSerializable
   12     {
   13 
   14         private static readonly BinaryFormatter bf = new BinaryFormatter();
   15         private T originalValue;
   16 
   17         public static implicit operator T(XmlSerializable<T> x)
   18         {
   19             return x.originalValue;
   20         }
   21 
   22         public static implicit operator XmlSerializable<T>(T x)
   23         {
   24             XmlSerializable<T> a = new XmlSerializable<T>();
   25             a.originalValue = x;
   26             return a;
   27         }
   28 
   29         #region IXmlSerializable Members
   30 
   31         public XmlSchema GetSchema()
   32         {
   33             return null;
   34         }
   35 
   36         public void ReadXml(XmlReader reader)
   37         {
   38             using(MemoryStream memoryStream =new MemoryStream(Convert.FromBase64String(reader.ReadString())))
   39             {
   40                 T[] a = (T[]) bf.Deserialize(memoryStream);
   41                 originalValue = a[0];
   42             }
   43         }
   44 
   45         public void WriteXml(XmlWriter writer)
   46         {
   47             T[] a = new T[1];
   48             a[0] = originalValue;
   49             using(MemoryStream memoryStream = new MemoryStream())
   50             {
   51                 bf.Serialize(memoryStream, a);
   52                 memoryStream.Flush();
   53                 writer.WriteString(Convert.ToBase64String(memoryStream.ToArray()));
   54             }
   55         }
   56 
   57         #endregion
   58     }
   59 }
вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник Сериализуем несериализуемое ;) | dimzon541 - Поток не замутненного разумом сознания... | Лента друзей dimzon541 / Полная версия Добавить в друзья Страницы: раньше»