【问题标题】:XML Serialization produces random strings at the end? C# [duplicate]XML序列化最后会产生随机字符串吗? C# [重复]
【发布时间】:2016-07-07 11:39:36
【问题描述】:

序列化类并保存到文件时,有时会出现错误,序列化输出如下所示:

<?xml version="1.0"?>
<Template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Route>Some Route</Route>
    <TradePack>Something Here</TradePack>
    <Transport />
</Template>te> ------> Notice this extra string?

我正在序列化的类如下所示:

[Serializable]
public class Template
{
    public string Route = string.Empty;
    public string TradePack = string.Empty;
    public string Transport = string.Empty;

    public Template()
    {

    }
}

我似乎无法弄清楚为什么会这样。这是我的序列化程序类:

    public static bool Save(object obj, string path)
    {
        try
        {
            XmlSerializer writer = new XmlSerializer(obj.GetType());

            using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                writer.Serialize(stream, obj);
            }

            return true;
        }
        catch { }
        return false;
    }

谢谢!

【问题讨论】:

  • 我曾经遇到过类似的问题,最终是文件从未完全清理过的错误。它总是留下一块。也许在你写之前删除文件。
  • 嗯,有道理,谢谢! :)
  • 所以,正如我所料。它几乎从不随机;)。

标签: c# xml serialization


【解决方案1】:

额外的输出可能是以前版本的输出文件(具有相同的名称)的剩余输出。

您可以通过将 FileModeOpenOrCreate 更改为 Create 来解决此问题。这样,如果输出文件已经存在,它就会被截断。

更简单的方法是使用File.Create(path)

XmlSerializer writer = new XmlSerializer(obj.GetType());
using (var stream = File.Create(path))
{
    writer.Serialize(stream, obj);
}

顺便说一句:通常最好让异常在调用堆栈中冒泡,直到您可以对它们做一些有意义的事情。只是默默地吞下异常并返回一个可能永远不会被检查的状态标志隐藏了实际问题,可能会在以后导致进一步的问题并使问题分析变得不必要地困难。

【讨论】:

  • 让我们提一下File.Create(path) 快捷方式。
  • 我已将 FileMode 更改为 Truncate,如果该文件尚不存在,则提前创建该文件。
  • @HenkHolterman 这真的不是很多工作,而且我不喜欢在不必要的时候使用外部库。
  • @J.Doe: File.Create 不是外部库,它是 .NET 的一部分。
  • 我不知道你在想什么,但我当时使用了 File.Create。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多