DataContractSerializer не сериализует свойства пользовательских коллекций

Я нашел похожие вопросы от людей о свойствах объектов в коллекции, но мой вопрос касается свойства самой коллекции. В приведенном ниже примере свойство Something объекта Collection не возвращается после сериализации.

Как я могу заставить DataContractSerializer сериализовать свойство Something коллекции? Я знаю об обходном пути создания свойства вне объекта коллекции, но это сводит на нет причину даже использования пользовательских коллекций (возможность добавлять к ней свойства в будущем).

Это происходит и с NetDataContractSerializer и XmlSerializer.

Объекты

[DataContract]
public class TempClass
{
    [DataMember]
    public TempStuffCollection Collection { get; set; }
}

[CollectionDataContract]
public class TempStuffCollection : List<TempStuff>
{
    [DataMember]
    public string Something { get; set; }
}

[DataContract]
public class TempStuff
{
    [DataMember]
    public string Foo { get; set; } = "Bar";
}

Помощники сериализации

public TempClass Deserialize(byte[] serializedBytes)
{
    using (Stream memoryStream = new MemoryStream(serializedBytes))
    {
        DataContractSerializer deserializer = new DataContractSerializer(typeof(TempClass));
        TempClass storeMessage = (TempClass)deserializer.ReadObject(memoryStream);
        return storeMessage;
    }
}

public byte[] Serialize(TempClass storeMessage)
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(TempClass));
        serializer.WriteObject(memoryStream, storeMessage);

        return memoryStream.ToArray();
    }
}

Пример программы

void Main()
{
    var o = new TempClass
    {
        Collection = new TempStuffCollection
        {
            new TempStuff(),
            new TempStuff(),
            new TempStuff(),
        }
    };

    o.Collection.Something = "this should still be here";

    var serialized = Serialize(o);
    var deserialized = Deserialize(serialized);

    // Outputs: 3
    Console.WriteLine(deserialized.Collection.Count);
    // Outputs: null
    Console.WriteLine(deserialized.Collection.Something ?? "null");
}

Вывод

3
null

person Chris Benard    schedule 13.11.2019    source источник
comment
Поскольку CollectionDataContract предоставляет Взаимозаменяемые коллекции. Например, у массива есть свойство Length, а у списка — свойство Count. Если бы они были сохранены, обеспечить взаимозаменяемость было бы невозможно.   -  person Alexander Petrov    schedule 13.11.2019
comment
Разве это не делает CollectionDataContractAttribute и пользовательские коллекции бессмысленными, поскольку у них не может быть ничего, что отличало бы их от List<T>?   -  person Chris Benard    schedule 13.11.2019
comment
Это не бессмысленно, потому что позволяет настроить имя и пространство имен контракта данных, а также имя и пространство имен элемента, например. как показано в Как настроить сериализацию словаря с помощью DataContractSerializer? или необходимо иметь дочерний элемент с помощью DataContractSerializer для заполнения XML.   -  person dbc    schedule 13.11.2019
comment
Расширенные правила коллекций содержат таблицу с методами сериализации/десериализации   -  person Pavel Anikhouski    schedule 13.11.2019
comment
На самом деле есть два потока здесь и здесь, в котором говорится, что это невозможно с DCS   -  person Pavel Anikhouski    schedule 13.11.2019
comment
@ChrisBenard. Как объяснялось в ветке комментариев, применение [DataContract] означает, что вы получаете свойства коллекции; применение [CollectionDataContract] (или ничего не делать) означает, что вы получаете элементы коллекции; но нет возможности получить оба. Тема полностью отвечает на ваш вопрос? Или вам нужен обходной путь?   -  person dbc    schedule 14.11.2019
comment
@dbc уже применил обходной путь. Инкапсулировал коллекцию внутри коллекции. Полный ответ в комментариях.   -  person Chris Benard    schedule 14.11.2019