Как мне сериализовать объект с помощью TimeSpan и Generic Lists в XML в C #? - PullRequest
8 голосов
/ 16 ноября 2010

Я пытался использовать XmlSerializer, но XmlSerializer не будет сериализовать значение TimeSpan;он просто генерирует пустой тег для временных интервалов (в противном случае было бы идеально).

Итак, я попытался использовать SoapFormatter, но SoapFormatter не будет сериализовывать универсальные списки;это просто приводит к исключению.

Какие еще варианты у меня есть?Я не могу внести никаких изменений в класс объекта, который я сериализую, потому что он генерируется из ссылки на сервис.Таким образом, все обходные пути, связанные с изменением класса, отсутствуют.

У меня нет выбора, кроме как реализовать собственный сериализатор?Могу ли я использовать какие-либо внешние инструменты?

Ответы [ 2 ]

6 голосов
/ 16 ноября 2010

Вы можете использовать DataContractSerializer


[DataContract]
public class TestClass
{
    // You can use List<T> or other generic collection
    [DataMember]
    public HashSet<int> h { get; set; }

    [DataMember]
    public TimeSpan t { get; set; }

    public TestClass()
    {
        h = new HashSet<int>{1,2,3,4};
        t = TimeSpan.FromDays(1);
    }
}

var o = new TestClass();

ms = new MemoryStream();

var sr = new DataContractSerializer(typeof(TestClass));
sr.WriteObject(ms, o);

File.WriteAllBytes("test.xml", ms.ToArray());

ms = new MemoryStream(File.ReadAllBytes("test.xml"));

sr = new DataContractSerializer(typeof(TestClass));
var readObject = (TestClass)sr.ReadObject(ms);

Результат:

<TestClass xmlns="http://schemas.datacontract.org/2004/07/Serialization" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><h xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>1</a:int><a:int>2</a:int><a:int>3</a:int><a:int>4</a:int></h><t>P1D</t></TestClass>
1 голос
/ 16 ноября 2010
...