2010-04-20 16 views
7

piszę typowych funkcji serializacji dany obiekt i Lista <obiekt> następująco grzywnyJak serializacji z wykazu <object>

public string SerializeObject(Object pObject)// for given object 
{ 
    try 
    { 
     String XmlizedString = null; 
     MemoryStream memoryStream = new MemoryStream(); 
     XmlSerializer xs = new XmlSerializer(typeof(pObject)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
     xs.Serialize(xmlTextWriter, pObject); 
     memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
     XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
     return XmlizedString; 
    } 
    catch (Exception e) { System.Console.WriteLine(e); return null; } 
} 

public string SerializeObject(List<Object> pObject)// for given List<object> 
{ 
    try 
    { 
     String XmlizedString = null; 
     MemoryStream memoryStream = new MemoryStream(); 
     XmlSerializer xs = new XmlSerializer(typeof(pObject)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
     xs.Serialize(xmlTextWriter, pObject); 
     memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
     XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
     return XmlizedString; 
    } 
    catch (Exception e) { System.Console.WriteLine(e); return null; } 
} 

pierwszy działa. Jeśli przekażę dowolny typ, pomyślnie zwraca ciąg xml.

KOREKTA: Błąd kompilacji wystąpił na drugim (błąd. Nie można przekonwertować z List<MyType> do List<object>

ja przepisać drugi w następujący sposób, który rozwiązuje mój problem teraz jest szeregowania daną List<generic types>

..
private string SerializeObject<T>(T source) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 
    XmlSerializer xs = new XmlSerializer(typeof(T)); 
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
    xs.Serialize(xmlTextWriter, source); 
    memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
    string XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
    return XmlizedString; 
} 
+2

@afin: może nie zdawałeś sobie sprawy, ale nie powinieneś już używać 'nowego XmlTextWriter()'. Został przestarzały na rzecz 'XmlWriter.Create()'. Od .NET 2.0. –

+0

@john: dziękuję – afin

+0

Możesz sprawdzić Fasterflect (http://fasterflect.codeplex.com), który zawiera metodę rozszerzenia Toxml dla obiektów. Jest tylko w jedną stronę i może nie być tym, czego potrzebujesz, ale będzie działać praktycznie dla każdego obiektu. –

Odpowiedz

1

https://weblogs.asp.net/rajbk/Contents/Item/Display/345

Odpowiedni kod z artykułu:

private static string SerializeObject<T>(T source) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using (var sw = new System.IO.StringWriter()) 
    using (var writer = XmlWriter.Create(sw)) 
    { 
     serializer.Serialize(writer, source); 
     return sw.ToString(); 
    } 
} 
+0

@Raj: Dziękuję – afin

+1

martwy link ... nie można się tam dostać stąd – Brian

2

Próbowałem twoich dwóch funkcji bez większych problemów. Jedyną rzeczą, którą zmienił się ten wiersz:

XmlSerializer xs = new XmlSerializer(typeof(pObject)); 

do tego:

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 

typeof() wymaga rzeczywistego typu, natomiast GetType() zwraca typ obiektu.

+0

@quagland: przepraszam, moje pytanie zostało poprawione. Wystąpił błąd kompilacji dla drugiego, ponieważ przekazałem listę jako parametr wejściowy. Potrzebuję tej wspólnej funkcji, która powinna wspierać wszystkie typy. – afin

Powiązane problemy