将XDocument保存到PCL C#中的文件

时间:2017-06-25 00:31:24

标签: c#

我在我的PCL库中工作,需要序列化一个类并输出到一个文件。我的空间很短,所以没有PCLStorage的空间。

目前我正在使用它进行序列化。 IFilePath从非PCL部分返回文件路径。

    IFilePath FilePath;

    public void SerializeObject<T>(T serializableObject, string fileName)
    {
        if (serializableObject == null) { return; }

        try
        {
            using (var ms = new MemoryStream())
            {
                var xmlDocument = new XDocument();
                using (var writer = xmlDocument.CreateWriter())
                {
                    var serialize = new DataContractSerializer(typeof(T));
                    serialize.WriteObject(writer, serializableObject);

                    xmlDocument.Save(ms, SaveOptions.None);
                }
            }
        }
        catch (Exception ex)
        {
            //Log exception here
        }
    }

当我尝试保存时,没有任何显示。我有一种感觉,因为我没有将流输出到文件,但我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:0)

问题是using (var ms = new MemoryStream())中的变量ms为空,并且没有指向MemoryStream没有接收文件路径作为参数的任何文件位置。我建议你改用StreamWriter并将你的FileStream传递给它。实施例

使用您的fileName创建一个继承自Stream类的FileStream,然后将Memory流替换为新创建的文件流,如下所示。

using(FileStream stream = File.OpenWrite(fileName))
{
    var xmlDocument = new XDocument();
            using (var writer = xmlDocument.CreateWriter())
            {
                var serialize = new DataContractSerializer(typeof(T));
                serialize.WriteObject(writer, serializableObject);

                xmlDocument.Save(stream, SaveOptions.None);
            }
}

希望这有帮助。

答案 1 :(得分:0)

您正在尝试保存到文件,这是一个特定于每个平台的操作。 PCLStorage正在为每个平台实现此功能,如果您不能使用它,这也是您必须要做的。

在您的情况下,您需要做的是在非pcl代码中创建流(在每个平台中),然后将其传递给您的函数,如下所示:

public void SerializeObject<T>(T serializableObject, Stream fileStream)
{
    if (serializableObject == null) { return; }

    try
    {
        var xmlDocument = new XDocument();
        using (var writer = xmlDocument.CreateWriter())
        {
           var serialize = new DataContractSerializer(typeof(T));
           serialize.WriteObject(writer, serializableObject);
           xmlDocument.Save(fileStream, SaveOptions.None);
        }
    }
    catch (Exception ex)
    {
        //Log exception here
    }
}

更多关于pcl here