Страницы

Поиск по вопросам

Показаны сообщения с ярлыком serialize. Показать все сообщения
Показаны сообщения с ярлыком serialize. Показать все сообщения

среда, 5 февраля 2020 г.

Утечка памяти - потоки и серелизаторы (Thread и Serialize)

#c_sharp #serialize #многопоточность #memory


Имеется многопоточное приложение, использующее в потоках сериализаторы и десериализаторы,
а так же очередт..

Потоки используются класса Thread, серелизаторы DataContractJsonSerializer (с методами
ReadObject и WriteObject - с одним параметром, Type), а в качестве очереди используется
Queue. 
Периодически создаются объекты, которые добавляются в очередь для последующей обработке
конвейерном ещё в одном потоке. Очередь обрабатывается быстро, быстрее чем в неё поступают
данные. 
В приложении имеется утечка памяти (Working Set растет за час примерно мегабайт на
10 - смотрю через Process Explorer v15.22, - а за пару суток набигает до 512 МБайт).
Приложение использует десериализацию в 2-3 потоках каждые 5-15 секунд.

Вопрос: в какую сторону копать - искать утечку памяти в потоках или сериализаторах,
или может даже в очереди (в последнем я очень сомневаюсь) ?    


Ответы

Ответ 1



Копать нужно только в одном направлении. Вот простая, но хорошая методика поиска утечек, которая скорее всего поможет: подбираем методику, которая приводит к утечке памяти (в соответствии с TaskManager или по факту OutOfMemory). В Вашем случае это просто запустить и подождать часок-другой. Скачиваем Memory analysis tool (тут зависит от желания - кто то может потратить штуку денег и купить крутой анализатор, а кто то может скачать простой, написанный на коленке). К примеру этот его 10 дней триала может хватить. Либо этот от МС с описанием. Тут ещё гугл может очень помочь. запустив программу под анализатором, смотрим результат. Обычно, если есть утечка, то каких то определенных объектов в памяти оказывается очень много. В некоторых случаях можно запускать несколько раз подряд с разной длительностью и смотреть на динамику. Если каких то объектов 1000, но кол-во не изменяется - может они просто кешируются. А течь может один объект в минуту, но на 10 мб. И даже через час их будет 60 штук. вычислив объект(ы), количество которых растет, ищем в памяти их жизненный цикл, гуглим, спрашиваем о них на хэшкоде. Поначалу будет казаться сложно - в дампе тысячи объектов. Но потом придет понимание и они не будут замечаться.

Ответ 2



У меня тоже была когда-то похожая проблема. Тоже приложение жрало всю отведенную память, затем, через несколько часов выдавало ошибку: Out of Memory После того, как я посмотрел состояние потоков приложения через монитор ресурсов, то я ахнул! Я допустил фатальную ошибку - не указывал при создании потока его автоудаление по завершению его работы. В итого "висело" порядка 300 ожидающих потоков в одном процессе! И это количество постоянно росло! Быть может, вы просто создаете по одному новому потоку в таймере, например, но его потом не удаляете?

пятница, 31 января 2020 г.

Почему при сериализации получается рекурсия?

#c_sharp #wpf #json #рекурсия #serialize


Почему когда я хочу сериализовать в JSON какой нибудь контрол, то вылазит рекурсия?

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(label1);

    


Ответы

Ответ 1



Потому что у контрола есть ссылка на родительский контрол, а у того список ссылок на детей - круг замкнулся. Можно написать свою обертку, у которой только те свойства, которые Вы хотите сохранить. public class ControlWrapper { private Control fControl; public ControlWrapper(Control aControl) { fControl = aControl; } public int Width { get { return fControl.Width; } } ... } JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(new ControlWrapper(label1));

Ответ 2



Потому что вы пытаетесь сериализировать несериализируемое: UI-контрол. Контролы не предназначены для сериализации, т. к. у них есть внутреннее состояние и внутренние привязки (например — подписки на события), которые невозможно сохранить при сериализации. Делайте правильно, сохраняйте модель, а не представление. Срезать углы не выйдет.

Ответ 3



Раз вы используете wpf, можно попробовать XAML-сериализацию.

суббота, 4 января 2020 г.

Как я могу в .net сериализовать GUID без дефисов?

#c_sharp #xml #serialize


Как я могу в .net сериализовать в формат XML GUID без дефисов?

Структура выходного документа не важна.

Необходимо, например, вместо 5c88f0fc-9edf-4428-9ee1-b28ba2a5f03c
получить 5c88f0fc9edf44289ee1b28ba2a5f03c
    


Ответы

Ответ 1



В качестве воркэраунда можно использовать такую конструкцию: public class Data { public int X { get; set; } [XmlIgnore] // это не сериализуем public Guid Y { get; set; } [XmlElement(ElementName = "Y")] // а вместо Y сериализуем вот это public string YSerializable { get => Y.ToString("N"); set => Y = Guid.Parse(value); } } Получаем XML: 1 0102030405060708090a0b0c0d0e0f10 Минус: лишнее свойство, нужное лишь для сериализации. В качестве альтернативы, можно реализовать IXmlSerializable. Но это, наверное, больше мороки.

среда, 11 декабря 2019 г.

Не работает сериализация объекта из xml в string C#

#c_sharp #алгоритм #xml #serialize


Рутовый класс:

[Serializable]
[XmlRoot("Main")]
public class MainClass
{
    public MainClass()
    {
        Parents = new List();
    }

    [XmlElement("Parent")]
    public List Parents { get; set; }
}


Есть родительский класс:

[Serializable]
[XmlRoot("Parent")]
public class MyParent
{
    public enum myEnum : int
    {
        One,
        Two,
        Three
    };

    [XmlAttribute("Id")]
    public string Id { get; set; }

    [XmlAttribute("Name")]
    public string Name { get; set; }
}   


Есть класс, расширяющий его:

[Serializable]
[XmlRoot("Parent")]
public class MyChild : MyParent
{
    public MyChild()
    {
        Child = new List();
    }

    [XmlElement("Child")]
    public List Child { get; set; }
}


Этот класс раскрывает, что внутри тега Child:

[Serializable]
[XmlRoot("Child")]
public class InnerParameter
{
    public InnerParameter()
    {

    }

    [XmlText]
    public string Value { get; set; }
}


Затем, пытаюсь сериализовать:

MainClass newMainXml = new MainClass();
newMainXml.Parents = new List();
MyChild ch = new MyChild ();

ch.Id = "123";
ch.Name = "Stefani";

InnerParameter parameter = new InnerParameter();
parameter.Value = "MyText";
ch.Child.Add(parameter);

newMainXml.Parents.Add(ch);

XmlSerialization.TrySerializeObjectToXmlString(newMainXml, out result);


Хочу на выходе такую XML:

MyText
Получаю ошибку сериализации: There was an error generating the XML document. The type MyChild was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically. Подскажите пожалуйста, что я делаю не так в формировании xml? Почему сериализация не работает? (Есть большое подозрение, что дело тут в наследовании и зависимости классов между собой. Наверно, надо сказать, что MyChild не единственный класс, который расширяет MyParent...) P.S.: похоже, что тут ситуация как у меня почти: XML-сериализация объекта с полем типа Object C#


Ответы

Ответ 1



Судя по всему TrySerializeObjectToXmlString у вас реализован примерно так: private static void TrySerializeObjectToXmlString(MainClass ch, out string result) { StringBuilder sb = new StringBuilder(); using (var writer = new StringWriter(sb)) { XmlSerializer s = new XmlSerializer(typeof(MainClass)); s.Serialize(writer, ch); } result = sb.ToString(); } С такой реализацией он падает именно с ошибкой из вопроса. В таком случае должно хватить добавления XmlInclude на тип MyParent: [Serializable] [XmlRoot("Command")] [XmlInclude(typeof(MyChild))] public class MyParent { public enum myEnum : int { One, Two, Three }; [XmlAttribute("Id")] public string Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } }

Ответ 2



Попробуй так :) internal class Program { private static void Main(string[] args) { var ch = new MyChild(); ch.Id = "123"; ch.Name = "Stefani"; var parameter = new InnerParameter(); parameter.Value = "MyText"; ch.Child.Add(parameter); string result = XmlHelper.ObjectToXmlString(ch); } public static class XmlHelper { public static string ObjectToXmlString(object obj) { var xmlSerializer = new XmlSerializer(obj.GetType()); using (var textWriter = new StringWriter()) { xmlSerializer.Serialize(textWriter, obj); return textWriter.ToString(); } } } } Т.к. был отредактирован вопрос - вот новое решение исправления ошибки, которое выдает Ваш код: [Serializable, XmlInclude(typeof(MyChild))] [XmlRoot("Main")] Просто добавьте XmlInclude(typeof(MyChild)) для класса MainClass, т.к. он ничего не знает о MyChild это позволит ему распознать MyChild в процессе сериализации.

Ответ 3



Проблема решается действительно добавлением [XmlInclude(typeof(MyChild))] таким образом: [Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild))] public class MyParent { public enum myEnum : int { One, Two, Three }; [XmlAttribute("Id")] public string Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } } Моя ошибка была в том, что (для сравнения) у меня было написано так: [Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild)), XmlInclude(typeof(HisChild)), XmlInclude(typeof(HerChild))] public class MyParent { public enum myEnum : int { One, Two, Three }; [XmlAttribute("Id")] public string Id { get; set; } [XmlAttribute("Name")] public string Name { get; set; } } Однако, как я уже говорил, MyChild - не единственный класс, реализующий MyParent, и эти наследники так же необходимо сериализовать. Вот тут хорошая статья: Xml Сериализация и наследование

понедельник, 9 декабря 2019 г.

Как сериализовать List<T> в xml

#c_sharp #xml #serialize


Есть класс DB, который я хочу сериализовать в xml.

public class DB
{
    [XmlElement("Nomer")]
    public string Nomer { get; set; }

    [XmlElement("Raspolojenie")]
    public string Raspolojenie { get; set; }

    [XmlElement("Whois")]
    public string Whois { get; set; }

    [XmlElement("Start")]
    public string Start { get; set; }

    [XmlElement("End")]
    public string End { get; set; }
}


Пробовал такой вариант, но выдает ошибку. 

List listDB = new List();

XmlSerializer xmlSerializer = new XmlSerializer(typeof(DB));
StringWriter stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, listDB); 
string xml = stringWriter.ToString();

    


Ответы

Ответ 1



Вы объявляете сериализатор с типом вашего класса: new XmlSerializer(typeof(DB)); И передаете список объектов вашего класса: xmlSerializer.Serialize(stringWriter, listDB); Попробуйте объявить сериализатор с типом списка вашего класса: new XmlSerializer(typeof(List)); Проверить!

четверг, 5 декабря 2019 г.

Сериализация простыми словами

#java #android #serialize


Много раз встречал эту "сериализацию" на разных ресурсах, часто связано с JSON.

Объясните, пожалуйста, простыми словами, что такое сериализация, где и зачем ее применяют ?
    


Ответы

Ответ 1



Сериализация — это сохранение/преобразование объекта или дерева объектов в какой-либо формат с тем, чтобы потом эти объекты можно было восстановить из этого формата. Используется, например, для сохранения состояния программы (то есть, некоторых её объектов) между запусками. Или для передачи данных между различными экземплярами программы (или различными программами), например, по сети. Главная идея состоит в том, что сериализованный формат — набор байт или строка, которую можно легко сохранить на диск или передать другому процессу или например по сети, в отличие от самого объекта. А значит, задача сохранения объекта/группы объектов при этом сводится к простой задаче сохранения набора байт или строки. JSON — один из популярных форматов для сериализации, он текстовый, легковесный и легко читается человеком. Пример: если у вас есть класс class Test { int length; String name; public Test(int length, String name) { this.length = length; this.name = name; } } Объект этого класса в сериализованной форме может иметь вид { "length": 25, "name": "Имя" } Саму сериализацию (и десериализацию) можно производить вручную, или пользоваться соответствующими библиотеками/фреймворками. Существуют и бинарные форматы сериализации.

Ответ 2



Сериализация в общем виде - это процесс сохранения объекта в виде последовательности байт, чтобы в будущем по этой последовательности можно было бы восстановить исходный объект. В частном случае - это может быть сохранение в текстовую строку, хотя это далеко не обязательно. Если объект сериализуется в текстовую строку, то тут могут быть разные форматы, включая XML и упомянутый в вопросе JSON. Последний для этой цели наиболее популярен в последнее время, т.к. JSON - это и так представление объекта в том формате, как объект создается в JavaScript. Собственно, JSON и переводится как JavaScript Object Notation. Сериализацию можно использовать для хранения объектов на диске, для передачи его по сети или для передачи объекта другому процессу. Процесс, обратный сериализации, называется десереализация. В случае, если другой процесс получает строку JSON, то он должен десереализовать строку в объект.

Ответ 3



Если на кошках Вы пишете эмулятор кота - тамагочи. У вас есть объект класс cat class Cat { private int age; private int weight; // other cat logic } Вы хотите, чтобы при следующем запуске приложения этот же кот продолжал жить своей жизнью, а не пересоздался заново. Для этого вы реализуете сериализацию\десериализацию кота - то есть созранение\загрузку. Как - так как вам удобно. Можно сделать его Serializable и хранить в бинарном виде, можно сохранять в текстовый файл как JSON (JavaScript Object Notation), можно в базе хранить. Главное - вы сохраняете каким-то образом его состояние (в данном случае - поля), и потом, когда вам это будет нужно, их загружаете. Так же сериализованного кота можно будет например передать по сети на сервер. То есть вы передаете его состояние, а сервер у себя создаст новый объект класса Cat и установит у него это состояние (age и weight).

Ответ 4



Сериализация используется для хранения сущностей в виде строки. Например можно взять объект, сериализовать и записать в базу данных. Json - формат представления данных. Он может представлять объекты или массивы. Эти сущности также можно сериализовать. Если вывести сериализованый объект в Json, то можно получить строку сериализованного объекта.

пятница, 28 июня 2019 г.

Нестандартная сериализация/десериализация при помощи newtonsoft json

Есть следующие классы:
public sealed class User { public int Id { get; set; } public Schema Extensions { get; set; } }
public sealed class UserProperty { public string Id { get; set; } public object Value { get; set; } }
public sealed class Schema { public string Name { get; set; } public List Properties { get; set; } }
Задается вот так:
var user = new User { Id = 1, Extensions = new Schema { Name = "urn:scim:schemas:custom:1.0", Properties = new List { new UserProperty { Id = "A", Value = 1} }
} };
Необходимо получить json следующего вида:
{ "Id": 1, "urn:scim:schemas:custom:1.0": { "A": 1 } }
Как это можно сделать при помощи библиотеки newtonsoft? И соответственно потом десериализовать в структуры, описанные выше?


Ответ

Вам нужен JsonExtensionDataAttribute. Но тут есть ограничение - насколько я понимаю, он может быть только типа, реализующего IDictionary

вторник, 25 июня 2019 г.

Как исключить некоторые свойства при серилизации

Я пытаюсь сериализовать объект с несколькими свойствами, но не хочу включать все свойства при сериализации.
Конечно, я мог бы использовать атрибут [XmlIgnore], но мне необходима возможность делать это динамически.
Вопрос заключается в следующем как исключить некоторые свойства при серилизации не изменяя исходного класса, при это хотелось бы иметь строгую типизацию.
Заранее спасибо.


Ответ

сделать это можно следующим образом.
Воспользуемся готовым классом XmlAttributeOverrides но сделаем пару методов расширений для добавления строгой типизации:
public static class XmlAttributeOverridesHelpers { public static void Add(this XmlAttributeOverrides overrides, Expression> propertySelector, XmlAttributes attributes) { overrides.Add(typeof(T), propertySelector.BuildString(), attributes); }
public static string BuildString(this Expression propertySelector) { switch (propertySelector.NodeType) { case ExpressionType.Lambda: LambdaExpression lambdaExpression = (LambdaExpression)propertySelector; return BuildString(lambdaExpression.Body);
case ExpressionType.Convert: case ExpressionType.Quote: UnaryExpression unaryExpression = (UnaryExpression)propertySelector; return BuildString(unaryExpression.Operand);
case ExpressionType.MemberAccess:
MemberExpression memberExpression = (MemberExpression)propertySelector; MemberInfo propertyInfo = memberExpression.Member;
if (memberExpression.Expression is ParameterExpression) { return propertyInfo.Name; } else { // we've got a nested property (e.g. MyType.SomeProperty.SomeNestedProperty) return BuildString(memberExpression.Expression) + "." + propertyInfo.Name; }
default: // drop out and throw break; } throw new InvalidOperationException("Expression must be a member expression: " + propertySelector.ToString()); } }
применять можно следующим образом:
var overrides = new XmlAttributeOverrides(); var ignore = new XmlAttributes { XmlIgnore = true }; overrides.Add(m => m.Id, ignore); overrides.Add(m => m.DateChanged, ignore); Type t = typeof(List); XmlSerializer serial = new XmlSerializer(t, overrides);
Решение было найдено здесь

воскресенье, 7 апреля 2019 г.

Утечка памяти - потоки и серелизаторы (Thread и Serialize)

Имеется многопоточное приложение, использующее в потоках сериализаторы и десериализаторы, а так же очередт.. Потоки используются класса Thread, серелизаторы DataContractJsonSerializer (с методами ReadObject и WriteObject - с одним параметром, Type), а в качестве очереди используется Queue. Периодически создаются объекты, которые добавляются в очередь для последующей обработке конвейерном ещё в одном потоке. Очередь обрабатывается быстро, быстрее чем в неё поступают данные. В приложении имеется утечка памяти (Working Set растет за час примерно мегабайт на 10 - смотрю через Process Explorer v15.22, - а за пару суток набигает до 512 МБайт). Приложение использует десериализацию в 2-3 потоках каждые 5-15 секунд. Вопрос: в какую сторону копать - искать утечку памяти в потоках или сериализаторах, или может даже в очереди (в последнем я очень сомневаюсь) ?


Ответ

Копать нужно только в одном направлении. Вот простая, но хорошая методика поиска утечек, которая скорее всего поможет: подбираем методику, которая приводит к утечке памяти (в соответствии с TaskManager или по факту OutOfMemory). В Вашем случае это просто запустить и подождать часок-другой. Скачиваем Memory analysis tool (тут зависит от желания - кто то может потратить штуку денег и купить крутой анализатор, а кто то может скачать простой, написанный на коленке). К примеру этот его 10 дней триала может хватить. Либо этот от МС с описанием. Тут ещё гугл может очень помочь. запустив программу под анализатором, смотрим результат. Обычно, если есть утечка, то каких то определенных объектов в памяти оказывается очень много. В некоторых случаях можно запускать несколько раз подряд с разной длительностью и смотреть на динамику. Если каких то объектов 1000, но кол-во не изменяется - может они просто кешируются. А течь может один объект в минуту, но на 10 мб. И даже через час их будет 60 штук. вычислив объект(ы), количество которых растет, ищем в памяти их жизненный цикл, гуглим, спрашиваем о них на хэшкоде. Поначалу будет казаться сложно - в дампе тысячи объектов. Но потом придет понимание и они не будут замечаться.

среда, 3 апреля 2019 г.

Почему при сериализации получается рекурсия?

Почему когда я хочу сериализовать в JSON какой нибудь контрол, то вылазит рекурсия?
JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(label1);


Ответ

Потому что у контрола есть ссылка на родительский контрол, а у того список ссылок на детей - круг замкнулся.
Можно написать свою обертку, у которой только те свойства, которые Вы хотите сохранить.
public class ControlWrapper { private Control fControl;
public ControlWrapper(Control aControl) { fControl = aControl; }
public int Width { get { return fControl.Width; } }
... }
JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(new ControlWrapper(label1));

понедельник, 28 января 2019 г.

Как я могу в .net сериализовать GUID без дефисов?

Как я могу в .net сериализовать в формат XML GUID без дефисов?
Структура выходного документа не важна.
Необходимо, например, вместо 5c88f0fc-9edf-4428-9ee1-b28ba2a5f03c получить 5c88f0fc9edf44289ee1b28ba2a5f03c


Ответ

В качестве воркэраунда можно использовать такую конструкцию:
public class Data { public int X { get; set; }
[XmlIgnore] // это не сериализуем public Guid Y { get; set; }
[XmlElement(ElementName = "Y")] // а вместо Y сериализуем вот это public string YSerializable { get => Y.ToString("N"); set => Y = Guid.Parse(value); } }
Получаем XML:
1 0102030405060708090a0b0c0d0e0f10
Минус: лишнее свойство, нужное лишь для сериализации.

В качестве альтернативы, можно реализовать IXmlSerializable. Но это, наверное, больше мороки.

вторник, 16 октября 2018 г.

Не работает сериализация объекта из xml в string C#

Рутовый класс:
[Serializable] [XmlRoot("Main")] public class MainClass { public MainClass() { Parents = new List(); }
[XmlElement("Parent")] public List Parents { get; set; } }
Есть родительский класс:
[Serializable] [XmlRoot("Parent")] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Есть класс, расширяющий его:
[Serializable] [XmlRoot("Parent")] public class MyChild : MyParent { public MyChild() { Child = new List(); }
[XmlElement("Child")] public List Child { get; set; } }
Этот класс раскрывает, что внутри тега Child
[Serializable] [XmlRoot("Child")] public class InnerParameter { public InnerParameter() {
}
[XmlText] public string Value { get; set; } }
Затем, пытаюсь сериализовать:
MainClass newMainXml = new MainClass(); newMainXml.Parents = new List(); MyChild ch = new MyChild ();
ch.Id = "123"; ch.Name = "Stefani";
InnerParameter parameter = new InnerParameter(); parameter.Value = "MyText"; ch.Child.Add(parameter);
newMainXml.Parents.Add(ch);
XmlSerialization.TrySerializeObjectToXmlString(newMainXml, out result);
Хочу на выходе такую XML:

MyText

Получаю ошибку сериализации:
There was an error generating the XML document. The type MyChild was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
Подскажите пожалуйста, что я делаю не так в формировании xml? Почему сериализация не работает? (Есть большое подозрение, что дело тут в наследовании и зависимости классов между собой. Наверно, надо сказать, что MyChild не единственный класс, который расширяет MyParent...)
P.S.: похоже, что тут ситуация как у меня почти: XML-сериализация объекта с полем типа Object C#


Ответ

Проблема решается действительно добавлением [XmlInclude(typeof(MyChild))] таким образом:
[Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild))] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Моя ошибка была в том, что (для сравнения) у меня было написано так:
[Serializable] [XmlRoot("Parent")] [XmlInclude(typeof(MyChild)), XmlInclude(typeof(HisChild)), XmlInclude(typeof(HerChild))] public class MyParent { public enum myEnum : int { One, Two, Three };
[XmlAttribute("Id")] public string Id { get; set; }
[XmlAttribute("Name")] public string Name { get; set; } }
Однако, как я уже говорил, MyChild - не единственный класс, реализующий MyParent, и эти наследники так же необходимо сериализовать. Вот тут хорошая статья: Xml Сериализация и наследование

пятница, 12 октября 2018 г.

Как сериализовать List в xml

Есть класс DB, который я хочу сериализовать в xml
public class DB { [XmlElement("Nomer")] public string Nomer { get; set; }
[XmlElement("Raspolojenie")] public string Raspolojenie { get; set; }
[XmlElement("Whois")] public string Whois { get; set; }
[XmlElement("Start")] public string Start { get; set; }
[XmlElement("End")] public string End { get; set; } }
Пробовал такой вариант, но выдает ошибку.
List listDB = new List();
XmlSerializer xmlSerializer = new XmlSerializer(typeof(DB)); StringWriter stringWriter = new StringWriter(); xmlSerializer.Serialize(stringWriter, listDB); string xml = stringWriter.ToString();


Ответ

Вы объявляете сериализатор с типом вашего класса
new XmlSerializer(typeof(DB));
И передаете список объектов вашего класса:
xmlSerializer.Serialize(stringWriter, listDB);
Попробуйте объявить сериализатор с типом списка вашего класса
new XmlSerializer(typeof(List));
Проверить!