views:

486

answers:

1

Hi - I'm a bit stumped here. I just really want to XML Serialize an Array<> but I'm getting: "You must implement a default accessor on System.Array because it inherits from ICollection."

A snippet from my code is below. Any idea?

    Array a = Files.ToArray();
    XmlSerializer serializer = new XmlSerializer(typeof(Array));
    TextWriter textWriter = new StreamWriter(CONFIG_FILE_PATH);
    serializer.Serialize(textWriter, a);
    textWriter.Close();

thanks

PS. Here is what the Files object looks like:

private SerializableDictionary<string, ConfigFileDTO> files = new SerializableDictionary<string, ConfigFileDTO>();

public class ConfigFileDTO
        {
            private string path;
            private string content_type;
            private long file_size;
            private DateTime updated_at;
            private HttpStatusCode status_code;
            private bool discoveryAttempted = false;

            private List<ConfigFileDTO> parents = new List<ConfigFileDTO>();
            private List<ConfigFileDTO> children = new List<ConfigFileDTO>();
            .
            .
            .

The SerializableDictionary detail (given to me by someone else) was:

public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    #region IXmlSerializable Members
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();
        if (wasEmpty)
            return;
        while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");
            reader.ReadStartElement("key");
            TKey key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();
            reader.ReadStartElement("value");
            TValue value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();
            this.Add(key, value);
            reader.ReadEndElement();
            reader.MoveToContent();
        }
        reader.ReadEndElement();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        foreach (TKey key in this.Keys)
        {
            writer.WriteStartElement("item");
            writer.WriteStartElement("key");
            keySerializer.Serialize(writer, key);
            writer.WriteEndElement();
            writer.WriteStartElement("value");
            TValue value = this[key];
            valueSerializer.Serialize(writer, value);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
    #endregion

}
+2  A: 

Try something like this:

Object[] a = Files.ToArray();
XmlSerializer serializer = new XmlSerializer(typeof(Object[]));
TextWriter textWriter = new StreamWriter(@"d:\test.txt");
serializer.Serialize(textWriter, a);
textWriter.Close();

If you know the type of the array being return from the method type it as such (I have used Object[] since I don't know what it returns).

Andrew Hare
I'll try this...do u understand why there's an issue with what I was doing?
Greg
I'm getting an Error trying this "Cannot convert type 'System.Collections.Generic.KeyValuePair<string,IntranetSync_Desktop.ConfigFileDTO>[]' to 'object[]'". Any ideas?
Greg
PS. To assist re the above-mentioned issue I've added some additional details of my code in the original post area
Greg