Сериализация в C# без использования файловой системы

У меня есть простой двумерный массив строк, и я хотел бы вставить его в SPFieldMultiLineText в MOSS. Это сопоставляется с полем базы данных ntext.

Я знаю, что могу сериализовать в XML и сохранить в файловой системе, но я хотел бы сериализовать, не касаясь файловой системы.

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
}

Похоже, я должен быть в состоянии сделать что-то вроде этого:

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

но это не работает. Все примеры, которые я нашел, демонстрируют запись в текстовый файл.


person Nathan DeWitt    schedule 19.11.2008    source источник


Ответы (3)


Вот универсальный сериализатор (С#):

    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();
        }
    }

В вашем случае вы можете позвонить с помощью:

    SerializeObject<List<string>>(matrix);
person Harrison    schedule 19.11.2008

Используйте классы TextWriter и TextReader с классом StringWriter.

К остроумию:

XmlSerializer s = new XmlSerializer(typeof(whatever));
TextWriter w = new StringWriter();
s.Serialize(w, whatever);
yourstring = w.ToString();
person Paul Sonier    schedule 19.11.2008

В 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);
}
person JSC    schedule 19.11.2008
comment
Переход через массив байтов? Ой. - person bzlm; 20.02.2009
comment
Хотя один из вариантов. Есть несколько способов сделать это! Если у вас есть лучше, опубликуйте его! И я проголосую, если оно того стоит. - person JSC; 23.02.2009