2014-02-12 3 views
1

Имея некоторые проблемы с Xml сериализация в .Net (опять же) ...Косвенно определенный объект и десериализации

прилагается код (оригинал рабочая версия в верхней части, новый нерабочим версия ниже) enter image description here

(Cast в автопрокат был добавлен в качестве теста - он терпит неудачу с или без этого броска)

XML-Deserialize не выполняется для неявно заданного объекта со следующей ошибкой:

«Существует n ошибка в документе XML (0,0). " «Отсутствует элемент корня»

Любые предложения относительно того, почему я не могу десериализовать неявно объявленный объект. Похоже на логическую вещь, которую можно сделать - в чем разница между явным и неявным объектом?

btw, если я выполняю аренду.GetType(), он возвращает Rental (так что это правильный тип объекта, который создается).

метод десериализация выглядит следующим образом:

enter image description here

+0

Можете ли вы опубликовать код для вашего метода 'Deserialize'? – wdosanjos

+0

Добавлено в исходное сообщение – Jeeby

+0

Похоже, что содержимое «stream» является искаженным XML, или поток неправильно размещен. – wdosanjos

ответ

0

Пожалуйста, попробуйте добавить следующую строку в ваш метод Deserialize непосредственно перед десериализацией.

if (stream.CanSeek) stream.Position = 0; // fix a possible positioning issue on the stream 

var obj = s.Deserialize(stream); 
+0

Nah, который не исправит это ... теперь вызывает другую ошибку: В документе XML есть ошибка (1, 2). <аренда xmlns = ''> не ожидалось. – Jeeby

+0

По существу, насколько мне известно, там нет разницы между объектом, созданным var r = new Rental(); и: Аренда r = новый Аренда(); Так почему же верхняя неудача и нижняя не подведут? В коде нет ничего другого, кроме экземпляра объекта. Weird. – Jeeby

+0

Humm ... Я подозреваю, что вы не смываете поток сериализации должным образом, заставляя XML быть усеченным (искаженным). – wdosanjos

0

Одна вещь, которую я заметил в предыдущем комментарии

There is an error in XML document (1, 2). <rental xmlns=''>

Если XML в потоке фактически заклинания «аренда» с строчной р, я не знаю, как либо из них когда-либо будут работать - это должно быть «Аренда» с капиталом R, чтобы соответствовать вашему типу. Может быть, это просто опечатка, но я думал, что хочу указать, так как ваш код в противном случае должен работать. Обновление: ОП объяснил, что это из-за [XmlType("rental")] украшения на классе. Так что это не причина проблемы.

Если я не серьезно ошибаетесь, там на самом деле нет никакой разницы в скомпилированной версии

Rental r = new Rental(); 

и

var r = new Rental(); 

Использование XML файл (D:\Rental2.txt) так:

<Rental> 
<ID>10</ID> 
</Rental> 

Этот код будет работать в LinqPad и успешно десериализовать как явные и неявные переменные:

void Main() 
{ 
    var sw = new StreamReader(@"d:\Rental2.txt"); 
    try 
    { 
     //explicit 
     Rental r = new Rental(); 
     var Explicit = r.Deserialise(sw.BaseStream); 
     Console.WriteLine(Explicit); 

     //implicit 
     var rrr = new Rental(); 
     var Implicit = rrr.Deserialise(sw.BaseStream); 
     Console.WriteLine(Implicit); 
    } 
    catch(Exception) 
    { 
    } 
    finally 
    { 
     sw.Close(); 
    } 
} 

public class Rental 
{ 
    public int ID {get;set;} 
} 

public static class Extensions 
{ 
public static T Deserialise<T>(this T Object,Stream stream) 
    { 
     if (stream.CanSeek) 
     { 
      stream.Position=0; 
     } 
     var ser = new XmlSerializer(typeof(T)); 
     return (T)ser.Deserialize(stream); 
    } 
} 

Выход:

UserQuery+Rental 
ID 10 

UserQuery+Rental 
ID 10 

Вы можете разместить исходные данные вы пытаетесь deserialise от? Возможно, в этом есть что-то причудливое?

+0

Благодаря Стивен ... Вот почему десериализация работает с строчной «арендой» \t [Serializable] \t [XmlType («арендой»)] \t Аренды общественного класса: Property Что касается исходных данных, я не почему бы не проблема? Что происходит между явно определенным объектом и имплицитным? Они используют одни и те же данные, один не работает. Как это может быть проблемой с данными? – Jeeby

+0

@Gregorius ok, это ясно сейчас. На самом деле я был бы ошеломлен, если бы это было * проблемой с данными! Просто я не вижу ничего плохого в вашем коде, и действительно должно быть 0 разницы; Код, который я опубликовал, функционально такой же, как и у вас, поэтому я полагаю, что мы сейчас сжимаем соломинку :) Думаю, нам нужно принять подход сокращения; начните удалять вещи до тех пор, пока это не сработает - например, вы можете не наследовать от свойства, не украсить класс и попробовать с помощью ручного файла. Если это работает для обоих подходов, то оно устраняет сам код и т. Д. –

+0

Эй, Стивен, спасибо за идеи. Я на самом деле просто придумал решение, которое достаточно близко к тому, чего я пытался достичь. Вместо того, чтобы использовать неявное объявление, я использую явное, запустив десериализатор, а затем установив результирующий объект на неявную переменную для использования позже. Это не идеально, но это достаточно хорошо. У меня нет времени продолжать копаться в этом, это странно, и мне было бы интересно узнать, почему он не работает, но у меня есть большая рыба, чтобы жарить. Спасибо за вашу помощь :) – Jeeby

0

@wdosanjos является правильным.Если вы используете два Deserialize один за другим, попробуйте сбросить положение потока до 0 до Deserialize второго.

Rental r = new Rental(); 
r = r.Deserialize(stream); 

stream.Position = 0; // reset stream position. 

var rrr = new Rental(); 
rrr = ((Rental)rrr).Deserialize(stream); 
+0

Нет, это не он. Если я запустил неявно объявленный первый, он потерпит неудачу. Мне нужно будет сбросить позицию потока, чтобы получить явный, чтобы работать, если сначала попытаться запустить его на неявной, но это не относится к делу. Поток не является причиной этой проблемы. – Jeeby

Смежные вопросы