#c# #serialization
#c# #сериализация
Вопрос:
как быстро (не так много нужно сделать) сериализовать этот объект?
Dictionary<int, List<int[,]>>
оригинальный XmlSerializer не поддерживает словарь и массив[,]
Ответ №1:
Редактировать:
Поскольку Dictionary
не поддерживается XmlSerializer
, мой первоначальный ответ неверен, но я предоставляю ссылку на другую сериализацию. Лучший ответ — реализовать свой собственный KeyValuePair
класс и преобразовать Dictionary
в этот класс, чтобы его можно было сериализовать. Хорошее объяснение того, как реализовать и почему это необходимо, можно найти здесь.
ПРИМЕЧАНИЕ: Это мой старый ответ и неверный.
В этом примере используется встроенный.Класс Net XmlSerializer
для сериализации в строку. Сериализатор может выполнять запись в любой поток, так что, например, если вы выполняете сериализацию в файл, вы хотели бы использовать FileWriter
вместо StringWriter
.
// serialize into a string
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
// create a serializer for my specific type
XmlSerializer ser = new XmlSerializer(typeof(Dictionary<int, List<int[,]>>));
// perform serialization
ser.Serialize(sw, myObj);
// retrieve the final serialized result as a string I can work with
string serialized = sb.ToString();
// do something with serialized object
Комментарии:
1. Чувак, прости, но оригинальный XmlSerializer не поддерживает словарь и массив[,]
2. @KowalskyJan: Тогда, пожалуйста, упомяните это в своем посте 🙂
Ответ №2:
Если вам конкретно нужна сериализация XML, вам может помочь пользовательский класс. Поскольку вы на самом деле не делаете KeyValuePair
, попробуйте что-то вроде этого:
[XMLSerializable]
public class CustomDictionary
{
public int Key {get; set;}
public List<Coordinate> Value {get; set;}
}
[XMLSerializable]
public class Coordinate
{
public int X;
public int Y;
}
Это предполагает, что стандартная точка (которая, я полагаю, является двойным X, двойным Y) не будет работать, и что вы храните только одно значение в каждом столбце вашего массива int. Конечно, вы могли бы модифицировать этот класс контейнера в соответствии с вашими конкретными потребностями.
Как только вы правильно разметите свой код (нет — я не думаю, что это так), вы просто сможете вызвать stock XmlSerializer
для записи в XML.