2015-11-12 2 views
0

Привет Я создаю список объектов Expando и передаю его в сериализацию, и я получаю эту ошибку - Быть xml сериализуемыми типами, которые наследуются от ienumerable должен иметь реализацию объекта add, system.dynamic.expando не реализует add (system.object).Невозможно сериализовать объект Expando - объект expando не реализует add (system.object)

Я искал через подобные вопросы - но я не имею права ничего менять на serialiser ....

Есть ли другой способ?

+0

Я попытался создать подкласс от объекта Expando добавить Добавить метод, но объект Expando не может быть подклассы –

ответ

0

Вы можете сделать из DynamicObject и осуществить IXmlSerializable.

class Program 
{ 
    static void Main(string[] args) { 
     var filePath = @"c:\1.xml"; 
     dynamic expando = new SerilaizableExpandoObject(); 
     var serializer = new XmlSerializer(typeof(SerilaizableExpandoObject)); 

     expando.Name = "Anindya"; 
     expando.StackOverflowReputation = 100; 

     using (var writer = new StreamWriter(filePath)) { 
      serializer.Serialize(writer, expando); 
     } 

     expando = (SerilaizableExpandoObject)serializer.Deserialize(File.OpenRead(filePath)); 
     Console.WriteLine(expando.Name); 
     Console.WriteLine(expando.StackOverflowReputation); 
    } 
} 

public class SerilaizableExpandoObject : DynamicObject, IXmlSerializable, IDictionary<string, object> 
{ 
    private readonly string root = "SerilaizableExpandoObject"; 
    private readonly IDictionary<string, object> expando = null; 

    public SerilaizableExpandoObject() { 
     expando = new ExpandoObject(); 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) { 
     object value; 

     if (expando.TryGetValue(binder.Name, out value)) { 
      result = value; 
      return true; 
     } 

     return base.TryGetMember(binder, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) { 
     expando[binder.Name] = value; 

     return true; 
    } 

    public XmlSchema GetSchema() { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) { 
     reader.ReadStartElement(root); 

     while (!reader.Name.Equals(root)) { 
      object value; 
      string typeContent; 
      Type underlyingType; 
      var name = reader.Name; 

      reader.MoveToAttribute("type"); 
      typeContent = reader.ReadContentAsString(); 
      underlyingType = Type.GetType(typeContent); 
      reader.MoveToContent(); 
      expando[name] = reader.ReadElementContentAs(underlyingType, null); 
     } 
    } 

    public void WriteXml(XmlWriter writer) { 
     foreach (var key in expando.Keys) { 
      var value = expando[key]; 

      writer.WriteStartElement(key); 
      writer.WriteAttributeString("type", value.GetType().AssemblyQualifiedName); 
      writer.WriteString(value.ToString()); 
      writer.WriteEndElement(); 
     } 
    } 

    public void Add(string key, object value) { 
     expando.Add(key, value); 
    } 

    public bool ContainsKey(string key) { 
     return expando.ContainsKey(key); 
    } 

    public ICollection<string> Keys { 
     get { return expando.Keys; } 
    } 

    public bool Remove(string key) { 
     return expando.Remove(key); 
    } 

    public bool TryGetValue(string key, out object value) { 
     return expando.TryGetValue(key, out value); 
    } 

    public ICollection<object> Values { 
     get { return expando.Values; } 
    } 

    public object this[string key] { 
     get { 
      return expando[key]; 
     } 
     set { 
      expando[key] = value; 
     } 
    } 

    public void Add(KeyValuePair<string, object> item) { 
     expando.Add(item); 
    } 

    public void Clear() { 
     expando.Clear(); 
    } 

    public bool Contains(KeyValuePair<string, object> item) { 
     return expando.Contains(item); 
    } 

    public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex) { 
     expando.CopyTo(array, arrayIndex); 
    } 

    public int Count { 
     get { return expando.Count; } 
    } 

    public bool IsReadOnly { 
     get { return expando.IsReadOnly; } 
    } 

    public bool Remove(KeyValuePair<string, object> item) { 
     return expando.Remove(item); 
    } 

    public IEnumerator<KeyValuePair<string, object>> GetEnumerator() { 
     return expando.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() { 
     return this.GetEnumerator(); 
    } 
} 
+0

Я кастинг ExpandoObject в Словаре .. Это SerilaizableExpandoObject не может быть приведен в словарь ... –

+0

почему вам нужно бросить его в словарь? – Sagi

+0

Потому что я создаю динамические имена свойств - префикс каждого имени свойства от строго типизированного объекта –

Смежные вопросы