Исключение инструкции по обработке XML при сериализации объекта

Любой бин, который является Converter, должен работать и автоматически выбираться Spring Shell. Посмотрите на ConversionExample в примерах.

При этом, почему вы говорите, что хотите зарегистрировать все динамически ? Spring Shell предназначен для получения кода, снабженного специальными аннотациями (например, @ShellMethod). Хотя должна быть возможность динамически выполнять работу, которую выполняют стандартные регистраторы при просмотре этих аннотаций, из ваших примеров видно, что у вас все в порядке с аннотированием кода с помощью @ShellMethod? Так почему бы не позволить Spring Shell выполнить для вас обнаружение и регистрацию?

Другими словами: почему вы аннотируете интерфейс, а не метод реализации? Если вы это сделаете, вам не придется иметь дело с MethodTarget и т. Д., Все это делается автоматически для вас Spring Shell.

Надеюсь, это проясняет ситуацию и оказывается самым простым решением

10
задан Kent Fredric 28 December 2008 в 15:44
поделиться

6 ответов

Следующая ссылка возьмет Вас к сообщению, где у кого-то есть метод подавления инструкции по обработке при помощи XmlWriter и вхождения в состояние 'Элемента', а не состояние 'Запуска'. Это заставляет инструкцию по обработке не быть записанной.

Подавите инструкцию по обработке

При передаче XmlWriter сериализатору он только испустит инструкцию по обработке, если состоянием XmlWriter будет 'Запуск' (т.е. еще не имел ничего записанного в него).

// Assume we have a type named 'MyType' and a variable of this type named 
'myObject' 
System.Text.StringBuilder output = new System.Text.StringBuilder(); 
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); 
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); 
System.Xml.Serialization.XmlSerializer serializer = new 
System.Xml.Serialization.XmlSerializer(typeof(MyType)); 


writer.WriteStartElement("MyContainingElement"); 
serializer.Serialize(writer, myObject); 
writer.WriteEndElement(); 

В этом случае устройство записи будет в состоянии 'Элемента' (в элементе), таким образом, никакая инструкция по обработке не будет записана. Один Вы заканчиваете писать XML, можно извлечь текст из базового потока и обработать его к содержанию основы.

3
ответ дан 3 December 2019 в 19:36
поделиться

В 2,0, Вы использовали бы XmLWriterSettings. OmitXmlDeclaration, и сериализируют к XmlWriter - однако я не думаю, что это существует в 1,1; настолько не совсем полезный - но просто еще один "считают обновление" вещью... и да, я понимаю, что это не всегда возможно.

7
ответ дан 3 December 2019 в 19:36
поделиться

Я сделал маленькое исправление

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) )
{   
   serializer.Serialize(stringWriter, comments);  
  return builder.ToString();
}
9
ответ дан 3 December 2019 в 19:36
поделиться

Что относительно того, чтобы опустить пространства имен?

вместо использования

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                namespaces.Add("", "");

исключая:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
1
ответ дан 3 December 2019 в 19:36
поделиться

Это работает в.NET 1.1. (Но необходимо все еще рассмотреть обновление),

    XmlSerializer s1= new XmlSerializer(typeof(MyClass)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add( "", "" );


    MyClass c= new MyClass();
    c.PropertyFromDerivedClass= "Hallo";

    sw = new System.IO.StringWriter();
    s1.Serialize(new XTWND(sw), c, ns);
    ....

   /// XmlTextWriterFormattedNoDeclaration
   /// helper class : eliminates the XML Documentation at the
   /// start of a XML doc. 
   /// XTWFND = XmlTextWriterFormattedNoDeclaration
   public class XTWFND : System.Xml.XmlTextWriter
   {
     public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; }
     public override void WriteStartDocument() { }
   }
0
ответ дан 3 December 2019 в 19:36
поделиться

Если путем "обработки инструкции" Вы имеете в виду определение XML, то можно избежать этого путем установки свойства OmitXmlDeclaration XmlWriterSettings. Необходимо будет сериализировать использование XmlWriter, для выполнения этого.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

using ( XmlWriter stringWriter = new StringWriter(builder, settings) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}

Но ах, это не отвечает на Ваш вопрос для 1,1. Ну, для ссылки на других.

0
ответ дан 3 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: