2008-11-19 8 views
26

Ich habe eine einfache 2D-Array von Zeichenfolgen und ich würde gerne in einem SPFieldMultiLineText in MOSS stopfen. Dies wird einem Datenbankfeld ntext zugeordnet.Serialisierung in C# ohne Dateisystem

Ich weiß, dass ich in XML serialisieren und im Dateisystem speichern kann, aber ich möchte serialisieren, ohne das Dateisystem zu berühren.

public override void ItemAdding(SPItemEventProperties properties) 
{ 
    // build the array 
    List<List<string>> matrix = new List<List<string>>(); 
    /* 
    * populating the array is snipped, works fine 
    */ 
    // now stick this matrix into the field in my list item 
    properties.AfterProperties["myNoteField"] = matrix; // throws an error 
} 

Sieht aus wie ich in der Lage sein sollte, so etwas zu tun:

XmlSerializer s = new XmlSerializer(typeof(List<List<string>>)); 
properties.AfterProperties["myNoteField"] = s.Serialize.ToString(); 

aber das funktioniert nicht. Alle Beispiele, die ich gefunden habe, demonstrieren das Schreiben in eine Textdatei.

Antwort

40
StringWriter outStream = new StringWriter(); 
XmlSerializer s = new XmlSerializer(typeof(List<List<string>>)); 
s.Serialize(outStream, myObj); 
properties.AfterProperties["myNoteField"] = outStream.ToString(); 
2

in VB.NET

Public Shared Function SerializeToByteArray(ByVal object2Serialize As Object) As Byte() 
    Using stream As New MemoryStream 
     Dim xmlSerializer As New XmlSerializer(object2Serialize.GetType()) 
     xmlSerializer.Serialize(stream, object2Serialize) 
     Return stream.ToArray() 
    End Using 
End Function 

Public Shared Function SerializeToString(ByVal object2Serialize As Object) As String 
    Dim bytes As Bytes() = SerializeToByteArray(object2Serialize) 
    Return Text.UTF8Encoding.GetString(bytes) 
End Function 

in C#

public byte[] SerializeToByteArray(object object2Serialize) { 
     using(MemoryStream stream = new MemoryStream()) { 
      XmlSerializer xmlSerializer = new XmlSerializer(object2Serialize.GetType()); 
      xmlSerializer.Serialize(stream, object2Serialize); 
      return stream.ToArray(); 
     } 
} 

public string SerializeToString(object object2Serialize) { 
    byte[] bytes = SerializeToByteArray(object2Serialize); 
    return Text.UTF8Encoding.GetString(bytes); 
} 
+0

über einen Byte-Array nutzen? Autsch. – bzlm

+0

Eine der Möglichkeiten, obwohl. Es gibt mehrere Möglichkeiten, dies zu tun! Wenn Sie einen besseren haben, veröffentlichen Sie es! Und ich werde upvote, wenn es das wert ist. – JSC

5

Verwenden der Textwriter und Textreader Klassen mit dem String.

Nämlich:

XmlSerializer s = new XmlSerializer(typeof(whatever)); 
TextWriter w = new StringWriter(); 
s.Serialize(w, whatever); 
yourstring = w.ToString(); 
12

Hier ist ein generischer Serializer (C#):

public string SerializeObject<T>(T objectToSerialize) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     MemoryStream memStr = new MemoryStream(); 

     try 
     { 
      bf.Serialize(memStr, objectToSerialize); 
      memStr.Position = 0; 

      return Convert.ToBase64String(memStr.ToArray()); 
     } 
     finally 
     { 
      memStr.Close(); 
     } 
    } 

In Ihrem Fall könnten Sie rufen mit:

SerializeObject<List<string>>(matrix);