2015-05-19 46 views
2

我需要将内存流的任意内容转换为JSON 。以下是我正在尝试执行的一个快速示例:Newtonsoft Json.net - 如何序列化流的内容?

class Program 
{ 
    class TestClass { public int Test1;} 
    static void Main(string[] args) 
    { 
     var ms = new MemoryStream(); 
     var writer = new StreamWriter(ms); 
     writer.Write(new TestClass()); 
     writer.Flush(); 
     ms.Position = 0; 

     var json = JsonConvert.SerializeObject(/*???*/, Formatting.Indented); 
     Console.Write(json); 
     Console.Read(); 
    } 
} 

不确定传递给SerializeObject方法的是什么。如果我通过将MemoryStream(可变MS)我得到一个错误:

An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll

Additional information: Error getting value from 'ReadTimeout' on 'System.IO.MemoryStream'.

这是可能的序列化流的任意内容?

谢谢您可以使用转换器来实现一个MemoryStream的

+1

你可以序列化由'MemoryStream.ToArray()'返回的'byte []'。 Json.NET会将其序列化为[base 64 encoded string](http://www.newtonsoft.com/json/help/html/SerializationGuide.htm)。 – dbc

+0

看到这个答案http://stackoverflow.com/questions/8157636/can-json-net-serialize-deserialize-to-from-a-stream – EdmundYeung99

回答

7

序列化和反序列化内容:

public class MemoryStreamJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
    return typeof(MemoryStream).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
    var bytes = serializer.Deserialize<byte[]>(reader); 
    return bytes != null ? new MemoryStream(bytes) : new MemoryStream(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
    var bytes = ((MemoryStream)value).ToArray(); 
    serializer.Serialize(writer, bytes); 
    } 
} 

那么你的代码可能看起来像(我改变了“新识别TestClass()”,以“测试字符串”为JSON序列和反串行化)的更容易的比较:

private void CheckJsonSerialization() 
{ 
    var ms = new MemoryStream(); 
    var writer = new StreamWriter(ms); 
    writer.WriteLine("Test string"); 
    writer.Flush(); 
    ms.Position = 0; 

    var json = JsonConvert.SerializeObject(ms, Formatting.Indented, new MemoryStreamJsonConverter()); 
    var ms2 = JsonConvert.DeserializeObject<MemoryStream>(json, new MemoryStreamJsonConverter()); 
    var reader = new StreamReader(ms2); 
    var deserializedString = reader.ReadLine(); 

    Console.Write(json); 
    Console.Write(deserializedString); 
    Console.Read(); 
} 

这种转换器,也可以使用当流是串行化obj的一个属性等:

public class ClassToCheckSerialization 
    { 
    public string StringProperty { get; set; } 

    [JsonConverter(typeof(MemoryStreamJsonConverter))] 
    public Stream StreamProperty { get; set; } 
    } 

    private void CheckJsonSerializationOfClass() 
    { 
    var data = new ClassToCheckSerialization(); 
    var ms = new MemoryStream(); 
    const string entryString = "Test string inside stream"; 
    var sw = new StreamWriter(ms); 
    sw.WriteLine(entryString); 
    sw.Flush(); 
    ms.Position = 0; 
    data.StreamProperty = ms; 
    var json = JsonConvert.SerializeObject(data); 

    var result = JsonConvert.DeserializeObject<ClassToCheckSerialization>(json); 
    var sr = new StreamReader(result.StreamProperty); 
    var stringRead = sr.ReadLine(); 
    //Assert.AreEqual(entryString, stringRead); 
    } 
+0

优秀的解决方案。这应该被接受为答案。 –