Как мне сериализовать пользовательскую коллекцию в MongoDB.Bson? - PullRequest
0 голосов
/ 24 июня 2011

Документация для MongoDB.Bson.Serialization кажется тонкой. Я не могу понять, как правильно добавить мою собственную коллекцию в документ MongoDB. Я использую их драйвер по умолчанию c # .

Это класс, который я пытаюсь сериализовать, но когда я смотрю на результат после того, как он сериализован, а затем десериализован, коллекция пуста. Точнее говоря, он создает новый экземпляр класса, но коллекция "_items" выходила нулевой. Я нашел это необычным, учитывая, что это была частная коллекция интерьера. Эта коллекция является свойством гораздо большего класса, остальные свойства класса корректно сериализуются. Я сериализовал это в XML с помощью встроенных сериализаторов, и это работало нормально. Я полагаю, что это, вероятно, что-то простое, но если не считать создания собственной реализации сериализации, я не знаю, что это такое. Есть ли что-то, что я должен сделать, чтобы сериализатор рассматривал это как коллекцию?

Поскольку я новичок в MongoDB, я не понял, как создавать большие необработанные документы для проверки того, как выглядит сам документ MongoDB. Вот над чем я сейчас работаю.

[XmlRootAttribute(ElementName = "Children", IsNullable = true)] 
public class ChildList : IList<SurveyItem>, ICollection<SurveyItem> 
{
    private SurveyItem _parent = null;
    public ChildList(SurveyItem iParent)
    {
        _parent = iParent;      
    }

    private List<SurveyItem> items = new List<SurveyItem>();        

    #region ICollection<SurveyItem> Members
    public void Add(SurveyItem item)
    {
        //wire up the child.
        item.Parent = _parent;
        items.Add(item);
    }

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

    public bool Contains(SurveyItem item)
    {
        return items.Contains(item);
    }

    public void CopyTo(SurveyItem[] array, int arrayIndex)
    {
        items.CopyTo(array, arrayIndex);
    }

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

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(SurveyItem item)
    {
        item.Parent = null;
        return items.Remove(item);
    }
    #endregion

    #region IEnumerable<SurveyItem> Members
    public IEnumerator<SurveyItem> GetEnumerator()
    {
        return items.GetEnumerator();
    }
    #endregion

    #region IEnumerable Members
    IEnumerator IEnumerable.GetEnumerator()
    {
        return (items as IEnumerable).GetEnumerator();
    }
    #endregion

    #region IList<SurveyItem> Members
    public int IndexOf(SurveyItem item)
    {
        return items.IndexOf(item);
    }

    public void Insert(int index, SurveyItem item)
    {
        item.Parent = _parent;
        items.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        items[index].Parent = null;
        items.RemoveAt(index);
    }

    public SurveyItem this[int index]
    {
        get
        {
            return items[index];
        }
        set
        {
            value.Parent = _parent;
            items[index] = value;
        }
    }
    #endregion

    public SurveyItem[] ToArray()
    {
        SurveyItem[] output = new SurveyItem[items.Count];
        for (int i = 0; i < items.Count; i++)
        {
            output[i] = items[i];
        }
        return output;
    }
}

1 Ответ

2 голосов
/ 09 июля 2011

Сериализатор в драйвере C # просто ищет и сериализует открытые свойства чтения / записи класса. Сериализатор также имеет особые случаи для стандартных классов коллекций в .NET, таких как Словарь.

Элементы вашей коллекции хранятся в закрытом поле под названием items. Вот почему они не сериализуются.

Вы можете написать собственный сериализатор для вашего класса. Вы можете реализовать IBsonSerializable или написать IBsonSerializer и зарегистрировать его в BsonSerializer.RegisterSerializer.

Одна из проблем, с которой вы, вероятно, столкнетесь, это циклические ссылки: в вашей коллекции есть ссылка на родителя, который, скорее всего, в свою очередь имеет ссылку на ребенка. Циркулярные ссылки трудно сериализовать.

...