Так сложилось что в одном из моих проектов используется 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 }