В частности, причина, по которой мне нужно создать сборку сериализации, заключается в том, что мой код называется из процесса 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
Мобильная версия