Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataContractSerializer-如何将xml输出为字符串(与文件相反)_C#_Xml Serialization_Stream_Iostream_Datacontractserializer - Fatal编程技术网

C# DataContractSerializer-如何将xml输出为字符串(与文件相反)

C# DataContractSerializer-如何将xml输出为字符串(与文件相反),c#,xml-serialization,stream,iostream,datacontractserializer,C#,Xml Serialization,Stream,Iostream,Datacontractserializer,我有一个关于datacontractserializer的快速问题。也许这更像是一个流问题。我发现了一段将xml写入文件流的代码。我基本上不需要文件,只需要字符串输出 public static string DataContractSerializeObject<T>(T objectToSerialize) { var fs = new FileStream("test.xml", FileMode.OpenOrCreate); var serializer

我有一个关于datacontractserializer的快速问题。也许这更像是一个流问题。我发现了一段将xml写入文件流的代码。我基本上不需要文件,只需要字符串输出

public static string DataContractSerializeObject<T>(T objectToSerialize)
{   
    var fs = new FileStream("test.xml", FileMode.OpenOrCreate);
    var serializer = new DataContractSerializer(typeof(T));
    serializer.WriteObject(fs, objectToSerialize);
    fs.Close();
    return fs.ToString();
}
公共静态字符串DataContractSerialize对象(T objectToSerialize)
{   
var fs=new FileStream(“test.xml”,FileMode.OpenOrCreate);
var serializer=新的DataContractSerializer(typeof(T));
WriteObject(fs,objectToSerialize);
fs.Close();
返回fs.ToString();
}

fs.ToString()显然不是我想要的。我可以使用什么流或编写器等返回正确的字符串而不创建文件?我确实看过文件流创建的XML,它正是我要寻找的。XmlSerializer编写的XML有点奇怪,在本例中,我更喜欢DataContractSerializer的输出。有人能给我指出正确的方向吗?

类似这样的内容-将您的输出放入
内存流中,然后读回:

public static string DataContractSerializeObject<T>(T objectToSerialize)
{
    using(MemoryStream memStm = new MemoryStream())
    {
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(memStm, objectToSerialize);

        memStm.Seek(0, SeekOrigin.Begin);

        using(var streamReader = new StreamReader(memStm))
        {
             string result = streamReader.ReadToEnd();
             return result;
        }
    }
}
公共静态字符串DataContractSerialize对象(T objectToSerialize)
{
使用(MemoryStream memStm=new MemoryStream())
{
var serializer=新的DataContractSerializer(typeof(T));
WriteObject(memStm,objectToSerialize);
memStm.Seek(0,SeekOrigin.Begin);
使用(var streamReader=newstreamreader(memStm))
{
字符串结果=streamReader.ReadToEnd();
返回结果;
}
}
}

感谢@xr280xr在初稿中指出了我忘记的StringWriter处理方法

/// <summary>
/// Converts this instance to XML.
/// </summary>
/// <returns>XML representing this instance.</returns>
public string ToXml()
{
    var serializer = new DataContractSerializer(this.GetType());
    using (var output = new StringWriter())
    using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented })
    {
        serializer.WriteObject(writer, this);
        return output.GetStringBuilder().ToString();
    }
}
//
///将此实例转换为XML。
/// 
///表示此实例的XML。
公共字符串ToXml()
{
var serializer=新的DataContractSerializer(this.GetType());
使用(var输出=新的StringWriter())
使用(var writer=newxmltextwriter(输出){Formatting=Formatting.Indented})
{
serializer.WriteObject(writer,this);
返回output.GetStringBuilder().ToString();
}
}
甚至更简单:

var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
    serializer.WriteObject(writer, objectToSerialize);
    writer.Flush();
    return sb.ToString();
}

我建议结合和给出的方法:

公共静态字符串DataContractSerialize对象(T objectToSerialize)
{
使用(var输出=新的StringWriter())
使用(var writer=newxmltextwriter(输出){Formatting=Formatting.Indented})
{
新的DataContractSerializer(typeof(T)).WriteObject(writer,objectToSerialize);
返回output.GetStringBuilder().ToString();
}
}

@root答案的变体:

var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
    serializer.WriteObject(writer, objectToSerialize);
}

return sb.ToString();

看起来您交换了参数,它应该是memStm.Seek(0,SeekOrigin.Begin)@xar:是的,你完全正确-感谢你发现了这个错误-我现在已经修复了你的StringWriter也应该被处理掉。堆叠的using就是这样做的。这也将成为DataContractSerializer(和XmlSerializer类似)的一个很好的扩展方法<代码>公共静态字符串WriteObjectToString(此DataContractSerializer序列化程序,对象obj){…}
这是Pat的方法,带有marc_的方法签名。
var serializer = new DataContractSerializer(typeof(T));
var sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb))
{
    serializer.WriteObject(writer, objectToSerialize);
}

return sb.ToString();