2 using System.Collections.Generic;
6 namespace ICSharpCode.SharpZipLib.Silverlight.Serialization
9 /// Code originally authored by Rockford Lhotka:
10 /// http://www.lhotka.net/weblog/SilverlightSerialization.aspx,
11 /// presented here with minor naming and code changes.
13 public class SerializationInfo
15 private class ValueEntry
17 public string Name { get; private set; }
18 public object Value { get; private set; }
20 public ValueEntry(string name, object value)
27 private readonly Dictionary<string, ValueEntry> _values = new Dictionary<string, ValueEntry>();
29 internal SerializationInfo(int referenceId)
31 ReferenceId = referenceId;
34 internal int ReferenceId { get; private set; }
36 public string TypeName { get; set; }
38 public void AddValue(string name, object value)
40 _values.Add(name, new ValueEntry(name, value));
43 public object GetValue(string name)
46 return _values.TryGetValue(name, out result) ? result.Value : null;
49 internal XElement ToXElement()
51 var root = new XElement("o");
52 root.Add(new XAttribute("i", ReferenceId));
53 root.Add(new XAttribute("t", TypeName));
55 foreach (var item in _values)
57 var info = item.Value.Value as SerializationInfo;
60 var list = item.Value.Value as List<SerializationInfo>;
63 if (item.Value.Value != null)
64 root.Add(new XElement("f",
65 new XAttribute("n", item.Value.Name),
66 new XAttribute("v", item.Value.Value)));
70 var listElement = new XElement("l",
71 new XAttribute("n", item.Value.Name));
72 foreach (var listItem in list)
73 listElement.Add(new XElement("r",
74 new XAttribute("i", listItem.ReferenceId)));
75 root.Add(listElement);
79 root.Add(new XElement("r",
80 new XAttribute("n", item.Value.Name),
81 new XAttribute("i", info.ReferenceId)));
86 internal SerializationInfo(XElement data)
88 ReferenceId = Convert.ToInt32(data.Attribute("i").Value);
91 TypeName = data.Attribute("t").Value;
95 internal void Deserialize(XElement data, XmlFormatter formatter)
97 foreach (var item in data.Elements())
101 var entry = new ValueEntry(item.Attribute("n").Value, item.Attribute("v").Value);
102 _values.Add(entry.Name, entry);
104 else if (item.Name == "l")
106 var listItems = item.Elements().Select(content => new SerializationInfo(content)).ToList();
108 var entry = new ValueEntry(item.Attribute("n").Value, listItems);
109 _values.Add(entry.Name, entry);
113 var referenceId = Convert.ToInt32(item.Attribute("i").Value);
114 var entry = new ValueEntry(
115 item.Attribute("n").Value,
116 new SerializationInfo(referenceId));
117 _values.Add(entry.Name, entry);