Использование сериализации WCF задач NameValueCollection

Позвонить chart.reflow() мне помогло. Документы: http://api.highcharts.com/highcharts#Chart.reflow

5
задан kaze 2 June 2009 в 11:57
поделиться

4 ответа

Лучше всего отказаться от использования слабых типов, таких как NameValueCollection и ArrayList . Вместо этого используйте Dictionary и List .

9
ответ дан 18 December 2019 в 09:52
поделиться

NameValueCollection , похоже, не совсем подходит для этого варианта использования. Существует серия сообщений в этом блоге , которые посвящены этой проблеме и представляют возможное решение (а именно: ] используйте IDictionary ). Но я не тестировал.

4
ответ дан 18 December 2019 в 09:52
поделиться

Другой подход может заключаться в использовании класса-оболочки для адаптации NameValueCollection к сериализации WCF. Вот простой пример, который сериализует каждую пару «имя-значение» как одну строку с разделителями-запятыми. Затем он считывает это значение обратно в NameValueCollection после десериализации:

[CollectionDataContract]
public class NameValueCollectionWrapper : IEnumerable 
{
    public NameValueCollectionWrapper() : this(new NameValueCollection()) { }

    public NameValueCollectionWrapper(NameValueCollection nvc) 
    {
        InnerCollection = nvc;
    }

    public NameValueCollection InnerCollection { get; private set; }

    public void Add(object value) 
    {
        var nvString = value as string;
        if (nvString != null) 
        {
            var nv = nvString.Split(',');
            InnerCollection.Add(nv[0], nv[1]);
        }
    }

    public IEnumerator GetEnumerator() 
    {
        foreach (string key in InnerCollection) 
        {
            yield return string.Format("{0},{1}", key, InnerCollection[key]);
        }
    }
}

Это позволит вам использовать тип как стандартное свойство [DataMember] в вашем DataContract ] s, и вы также можете использовать стандартные методы сериализации WCF.

3
ответ дан 18 December 2019 в 09:52
поделиться

NameValueCollection не реализует напрямую интерфейс ICollection. Вместо этого NameValueCollection расширяет NameObjectCollectionBase. Это реализует интерфейс ICollection и перегруженный файл Add (system. string) не реализован в классе NameValueCollection. Когда вы используете XMLSerializer, XmlSerializer пытается сериализовать или десериализовать NameValueCollection как универсальную ICollection. Поэтому он ищет значение по умолчанию Add (System.String). При отсутствии метода Add (system.String) создается исключение.

Используйте класс SoapFormatter для сериализации вместо использования XML-сериализации. Чтобы использовать класс SoapFormatter, вы должны добавить ссылку на System.Runtime.Serialization.Formatters.Soap.dll.

// Serializing NameValueCollection object by using SoapFormatter
SoapFormatter sf = new SoapFormatter();
Stream strm1 = File.Open(@"C:\datasoap.xml", FileMode.OpenOrCreate,FileAccess.ReadWrite);
sf.Serialize(strm1,namValColl);
strm1.Close();

// Deserializing the XML file into NameValueCollection object
// by using SoapFormatter
SoapFormatter sf1 = new SoapFormatter();
Stream strm2 = File.Open(@"C:\datasoap.xml", FileMode.Open,FileAccess.Read);
NameValueCollection namValColl1 = (NameValueCollection)sf1.Deserialize(strm2);
strm2.Close();
1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: