2013-06-13 3 views
0

прилагает этот код, который работал до сих пор, как в течение года:Invalid XML во время сериализации

// prepare serializer (XSContent) 
XmlSerializer serializer = new XmlSerializer(typeof(XSContent)); 

using (TextWriter textWriter = new StreamWriter(this.fileName, false, Encoding.UTF8)) 
{ 
    // prepare the content for xml serialization 
    XSContent content = new XSContent(); 
    content.UserList = XSConverter.ConvertList<XSUser, TBSUser>(input.UserList); 
    content.GroupList = XSConverter.ConvertList<XSGroup, TBSGroup>(input.GroupList); 

    // perform serialization 
    serializer.Serialize(textWriter, content);     
} 

Но сегодня, тот же код, я тестировал с большим количеством данных: результат XML становится недействительным (пожалуйста обратите внимание на «остатки» в конце всего содержимого):

<?xml version="1.0" encoding="utf-8"?> 
<Content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UserList> 
     <User UserID="CI-0123"> 
      {...} 
     </User> 
     {...} 
    </UserList> 
    <GroupList> 
     <Group GroupID="TEST01"> 
     <GroupName>Test</GroupName> 
     <UserList> 
      <UserID>CI-0123</UserID> 
     </UserList> 
     </Group>  
     {...} 
    </GroupList> 
</Content>rID>AT-TEST-2348</UserID> 
    <UserID>AT-TEST-2349</UserID> 
    <UserID>AT-TEST-2350</UserID> 

Это сводит меня с ума, и я застрял. Куда, по вашему мнению, я должен искать? Что я делаю неправильно?

Возможно, важно отметить, что этот xml-файл составляет ~ 200 МБ. Кроме того, если что-то неясно, я мог бы предоставить дополнительную информацию.

EDIT1: Нет существующего файла, который может помешать. В моих тестах файл создается как новый!

EDIT2: Если добавить textWriter.WriteLine("XYZ") в конце концов, он появляется сразу после того, как </Content>, но я все еще вижу мусор после XYZ (как: </Content>XYZ>AT-TEST-2348</UserID>)

EDIT3: Очень странно, когда Я увеличил буфер до 8192, он работал нормально. После этого я вернулся к 4096 году и продолжал нормально работать. Я вижу это FileOptions.SequencialScan, и они пишут: «правильная работа по-прежнему гарантирована». Ну, я начинаю думать, может быть, что-то пошло не так с этим

Благодаря

ответ

0

В конце концов, похоже, он работал при использовании режима Truncate (файл всегда был в моем случае, созданный во время запуска приложения).

2

Как насчет

using(var stream = new FileStream(path, FileMode.CreateNew, FileAccess.Write, FileShare.Read, 4096)) { 
     using (var textWriter = new StreamWriter(stream, Encoding.UTF8)) { 
     ... 
     } 
    } 

Если проверить конструктор StreamWriter, это делается, как это (?):

[SecurityCritical] 
private static Stream CreateFile(string path, bool append, bool checkHost) 
{ 
    FileMode mode = append ? FileMode.Append : FileMode.Create; 
    return new FileStream(path, mode, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost); 
} 

См. http://msdn.microsoft.com/en-us/library/system.io.filemode.aspx для значений перечисления.

+0

Интересная мысль, я мог бы попробовать. Благодаря! – Learner

+0

Ну, это не помогает ... такое же поведение ... мм ... Если бы я мог найти значение по умолчанию FileOptions. У меня нет никакой подсказки, если это действительно важно, но SequentialScan звучит хорошо – Learner

+0

Можете ли вы исправить конструктор StreamWriter с момента кодирования 3-го параметра? Кстати, как я могу это увидеть? – Learner