2010-10-04 3 views
3

У меня есть то, что должно быть ОЧЕНЬ СИЛЬНОЙ проблемой с Serializer Data Contract. Он отказывается работать. Я просто пытаюсь сериализовать объект в XmlDocument, но я, кажется, нажимаю на стену.DataContractSerializer - Проблемы

Вот datacontracts я хочу сериализация:

[DataContract(Namespace="urn://test", Name = "ServiceFault1")] 
public class ServiceFault 
{ 
    [DataMember()] 
    public int hello { get; set; } 

    [DataMember()] 
    public List<Error> Errors {get; set;} 
} 

[DataContract(Namespace = "urn://test", Name = "Error1")] 
public class Error 
{ 
    [DataMember()] 
    public string ErrorCategoryCode { get; set; } 

    [DataMember()] 
    public string LocalErrorCode { get; set; } 

    [DataMember()] 
    public string Description { get; set; } 
} 

и метод, который делает сериализации;

public static XmlDocument Serialize(ServiceFault toSer) 
    { 
     DataContractSerializer ser = new DataContractSerializer(toSer.GetType()); 

     MemoryStream mem = new MemoryStream(); 
     ser.WriteObject(XmlWriter.Create(mem), toSer); 

     XmlDocument tmp = new XmlDocument(); 
     mem.Seek(0, SeekOrigin.Begin); 
     tmp.Load(mem); 

     return tmp; 
    } 

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

Если я использую XmlSerializer, это работает, однако я хотел бы понять, почему на земле код выше не работает? Почему сериализатор всегда пуст?

Спасибо за помощь! TM

+1

На вашем .WriteObject вызов, просто передать в поток (например, mem) - не создавать XmlWriter: 'ser.WriteObject (mem, toSer);' –

+0

@marc_s, что бы это изменилось? WriteObject будет создавать XwlWriter поверх потока в любом случае ... –

+0

@Thomas Levesque: в моем случае ** с ** XmlWriter он не работал, без - он работает безупречно ... go figure ... –

ответ

4

Это код, который я использую для сериализации объектов и, похоже, работает на меня. Также я думаю, что атрибуты DataContract не нужны, я использую только атрибут в одном месте, чтобы игнорировать элемент.

DataContractSerializer serializer = new DataContractSerializer(toSers.GetType()); 
MemoryStream ms = new MemoryStream(); 
serializer.WriteObject(ms, toSer); 
ms.Position = 0; 

string serializedContent; 
using(StreamReader sr = new StreamReader(ms)) 
{ 
    serializedContent = sr.ReadToEnd(); 
} 

Различия, которые я вижу в том, что я пишу непосредственно к MemoryStream и установки позиции в 0, а не вызывать Seek().

Вы можете загрузить полученную строку в XmlDocument, если хотите, используя XmlDocument.LoadXml в экземпляре.

+0

ms.Position = 0 ..... спасибо! –

3

Проблема заключается в следующей строке, так как XmlWriter не покраснела его содержимое в поток памяти еще:

ser.WriteObject(XmlWriter.Create(mem), toSer); 

Попробуйте вместо этого с помощью:

public static XmlDocument Serialize(ServiceFault toSer) 
{ 
    DataContractSerializer ser = new DataContractSerializer(toSer.GetType()); 
    XmlDocument tmp = new XmlDocument(); 
    using (MemoryStream mem = new MemoryStream()) 
    { 
     using (var memWriter = XmlWriter.Create(mem)) 
     { 
      ser.WriteObject(memWriter, toSer); 
     } 

     mem.Seek(0, SeekOrigin.Begin); 
     tmp.Load(mem); 
    } 
    return tmp; 
} 
Смежные вопросы