ISet <T>сериализация в JSON с использованием DataContractJsonSerializer - PullRequest
3 голосов
/ 23 июня 2011

Я делаю несколько тестов, чтобы проверить / понять сериализацию JSON в / из типов .Net в C #. Я пытаюсь использовать DataContractJsonSerializer.

Вот пример типа, который я пытаюсь сериализовать:

[DataContract]
[KnownType(typeof(HashSet<int>))]
public class TestModel
{
    [DataMember]
    public string StreetName { get; private set; }
    [DataMember]
    public int StreetId { get; private set; }
    [DataMember]
    public int NumberOfCars { get; set; }
    [DataMember]
    public IDictionary<string, string> HouseDetails { get; set; }
    [DataMember]
    public IDictionary<int, string> People { get; set; }
    [DataMember]
    public ISet<int> LampPosts { get; set; }

    public TestModel(int StreetId, string StreetName)
    {
        this.StreetName = StreetName;
        this.StreetId = StreetId;

        HouseDetails = new Dictionary<string, string>();
        People = new Dictionary<int, string>();
        LampPosts = new HashSet<int>();
    }

    public void AddHouse(string HouseNumber, string HouseName)
    {
        HouseDetails.Add(HouseNumber, HouseName);
    }

    public void AddPeople(int PersonNumber, string PersonName)
    {
        People.Add(PersonNumber, PersonName);
    }

    public void AddLampPost(int LampPostName)
    {
        LampPosts.Add(LampPostName);
    }
}

Когда я пытаюсь сериализовать объект этого типа, используя DataContractJsonSerializer, я получаю следующую ошибку:

{"'System.Collections.Generic.HashSet`1[System.Int32]' is a collection type and cannot be serialized when assigned to an interface type that does not implement IEnumerable ('System.Collections.Generic.ISet`1[System.Int32]'.)"}

Это сообщение мне не подходит. ISet<T> реализует IEnumerable<T> (а также IEnumerable). Если в моем классе TestModel я заменяю

public ISet<int> LampPosts { get; set; }

с

public ICollection<int> LampPosts { get; set; }...

тогда все проплывает.

Я новичок в JSON, поэтому любая помощь будет принята с благодарностью

1 Ответ

2 голосов
/ 04 июня 2015

Похоже, это известная ошибка Microsoft . Список поддерживаемых интерфейсов жестко задан в фреймворке, и ISet не является одним из них:

CollectionDataContract.CollectionDataContractCriticalHelper._knownInterfaces = new Type[]
{
  Globals.TypeOfIDictionaryGeneric,
  Globals.TypeOfIDictionary,
  Globals.TypeOfIListGeneric,
  Globals.TypeOfICollectionGeneric,
  Globals.TypeOfIList,
  Globals.TypeOfIEnumerableGeneric,
  Globals.TypeOfICollection,
  Globals.TypeOfIEnumerable
};

И да, сообщение об ошибке неверно. Таким образом, DataContractJsonSerializer не может сериализовать интерфейс ISet, его следует либо заменить одним из поддерживаемых интерфейсов, либо конкретной реализацией ISet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...