Создание сборки сериализации Xml для пользовательского XmlSerializerC#

Место общения программистов C#
Ответить
Anonymous
 Создание сборки сериализации Xml для пользовательского XmlSerializer

Сообщение Anonymous »

В моем классе есть методы для сериализации/десериализации с использованием структуры XML, отличной от той, которая создается с помощью сериализатора по умолчанию. Эти методы создают XmlSerializer для моего типа, но с целым рядом переопределений. Когда эти методы вызываются, я думаю, что внутри .NET все еще генерирует сборку сериализации, но я хотел бы сгенерировать эту сборку после компиляции, чтобы она не генерировалась во время выполнения. Как я могу создать сборку сериализации для этой пользовательской сериализации? Если я использую sgen.exe для этого типа, он, похоже, генерирует только сериализатор по умолчанию.

В частности, причина, по которой мне нужно создать сборку сериализации, заключается в том, что мой код называется из процесса Internet Explorer, который работает в защищенном режиме. Если среда выполнения .net пытается создать сборку сериализации, она вызывает csc.exe, и пользователю предлагается разрешить запуск этого процесса. Я не хочу, чтобы пользователям было предложено! Поэтому необходимо, чтобы вся сериализация/десериализация выполнялась без csc.exe.

Один из вариантов, который я могу придумать, — это захватить этот .cs, созданный во время выполнения, и поместить его в отдельный файл. сборку, а затем включение ее в свой продукт. Помимо того, что это немного неприятно, это поднимает проблему автоматического создания этого .cs в процессе сборки...

Возможно, также стоит упомянуть: мой Пользовательская сериализация XML также сериализует вложенные классы, поэтому, возможно, для них тоже будут автоматически сгенерированные сериализаторы. Моя пользовательская сериализация в основном выполняется следующим образом: она добавляет XmlIgnore к некоторым свойствам и удаляет XmlIgnore из других. Многие из этих свойств возвращают объекты, которые необходимо сериализовать, некоторые из них реализуют IXmlSerializable, некоторые используют сериализацию по умолчанию.

Код: Выделить всё

    public void SerializeToCustomXml1(XmlWriter writer)
{
try
{
CustomXmlSerializer1.Serialize(writer, this);
}
catch (Exception)
{
}
}

/// 
/// Static serializer so it's created just once. There's another one like this CustomXmlSerializer2 with a slightly different format again.
/// 
private static XmlSerializer CustomXmlSerializer1
{
get
{
if (_customXmlSerializer == null)
{
XmlAttributes dontIgnore = new XmlAttributes();
dontIgnore.XmlIgnore = false;

XmlAttributes attributes;
XmlAttributeOverrides overrides = new XmlAttributeOverrides();

// Include some fields in the XML that wouldn't be there otherwise.
overrides.Add(typeof (WebResource), "ID", dontIgnore);
overrides.Add(typeof (WebResource), "HasDestinationURLs", dontIgnore);
overrides.Add(typeof (Resource), "AccessDefindBy", dontIgnore);

attributes = new XmlAttributes();
attributes.XmlIgnore = false;
attributes.XmlElements.Add(new XmlElementAttribute("ActionID"));
overrides.Add(typeof(Action), "ID", attributes);

// Instead of serializing the Actions field we serialize CustomActionsXmlSerializer,
// which outputs different content in the XML
overrides.Add(typeof (WebResource), "Actions", ignore);
attributes = new XmlAttributes();
attributes.XmlIgnore = false;
attributes.XmlElements.Add(new XmlElementAttribute("Actions"));
overrides.Add(typeof (WebResource), "CustomActionsXmlSerializer", attributes);

// ... more of these overrides here ...
_customXmlSerializer1 = new XmlSerializer(typeof(WebResource), overrides);
}
return _customXmlSerializer1;
}
Перекрестная публикация здесь и здесь.

ОБНОВЛЕНИЕ:
О, этот ответ предполагает, что это просто это невозможно, поскольку XmlSerializer даже не ищет предварительно скомпилированную сборку, если вы используете XmlOverrides. Черт. Тогда я думаю, что лучший вариант — сгенерировать код сериализации, включить его в свой проект и вызвать его напрямую вместо вызова XmlSerializer. Есть мысли, как это сделать аккуратно?

Подробнее здесь: https://stackoverflow.com/questions/733 ... serializer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»