XML 更新现有 XML 文件时出现序列化错误

XML Serialization error when updating an existing XML file

我有一个在任何线程中都没有发现的问题!当使用新的对象值更新 XML 文件(通过序列化)时,它仅在新值大于 XML 中的现有属性值时才起作用,但在新值小于 XML 时不起作用现有值。

这是我用于序列化的代码

NewFit NF = new NewFit { A1 = CA1.SelectedItem.ToString(), A2 = A2.Text, A3 = A3.Text, A4 = A4.Text, A5 = A5.Text, A6 = A6.Text, A7 = A7.Text, A8 = A8.Text, B1 = B1.Text, B2 = B2.Text, B3 = B3.Text, B4 = B4.Text, B5 = B5.Text, B6 = B6.Text, B7 = B7.Text, B8 = B8.Text, C1 = C1.Text, C2 = C2.Text, C3 = C3.Text, C4 = C4.Text, C5 = C5.Text, C6 = C6.Text, C7 = C7.Text, C8 = C8.Text, D1 = D1.Text, D2 = D2.Text, D3 = D3.Text, D4 = D4.Text, D5 = D5.Text, D6 = D6.Text, D7 = D7.Text, D8 = D8.Text,
            E1 = E1.Text, E2 = E2.Text, E3 = E3.Text, E4 = E4.Text, E5 = E5.Text, E6 = E6.Text, E7 = E7.Text, E8 = E8.Text, F1 = F1.Text, F2 = F2.Text, F3 = F3.Text, F4 = F4.Text, F5 = F5.Text, F6 = F6.Text, F7 = F7.Text, F8 = F8.Text, G1 = G1.Text, G2 = G2.Text, G3 = G3.Text, G4 = G4.Text, G5 = G5.Text, G6 = G6.Text, G7 = G7.Text, G8 = G8.Text, H1 = H1.Text, H2 = H2.Text, H3 = H3.Text, H4 = H4.Text, H5 = H5.Text, H6 = H6.Text, H7 = H7.Text, H8 = H8.Text, I1 = I1.Text, I2 = I2.Text,
            I3 = I3.Text, I4 = I4.Text, I5 = I5.Text, I6 = I6.Text, I7 = I7.Text, I8 = I8.Text, J1 = J1.Text, J2 = J2.Text, J3 = J3.Text, J4 = J4.Text, J5 = J5.Text, J6 = J6.Text, J7 = J7.Text, J8 = J8.Text, K1 = K1.Text, K2 = K2.Text, K3 = K3.Text, K4 = K4.Text, K5 = K5.Text, K6 = K6.Text, K7 = K7.Text, K8 = K8.Text,L1 = L1.Text,L2=L2.Text,L3=L3.Text,L4=L4.Text,L5=L5.Text,L6=L6.Text,L7=L7.Text,L8=L8.Text};

        XmlSerializer serial = new XmlSerializer(typeof(NewFit));
        //JsonConvert.SerializeObject(NF);
        using (FileStream fs = new FileStream(MyCmnd.DocPath, FileMode.Open, FileAccess.Write))
        {

            serial.Serialize(fs, NF);
            fs.Close();
        }

           **example**

如果现有值为 <A1>Class 150</A1> 新值是 "class 150 AA" 那么一切都很好

当现有值为 <A1>Class 150</A1> 并且新值为 "Cl1" 然后它在根级别给出序列化错误。

感谢您的宝贵时间!

理想情况下,您需要提供一个可验证的示例(即您可以复制和粘贴并 运行 证明问题的示例),但我猜测 FileMode.Open 是您的问题。

Serialize 将只写入 FileStream 并在完成时停止。如果你的文件是 1000 字节,而你的新文件更小——比如 800 字节——你最后会有 200 字节的垃圾。内容几乎肯定会格式错误 XML,当您尝试反序列化时它会因此失败。

改用FileMode.Truncate。根据 the docs,这将在打开时将其长度设置为 0 字节:

Specifies that the operating system should open an existing file. When the file is opened, it should be truncated so that its size is zero bytes.

如果您需要处理文件可能不存在的情况,请使用 FileMode.Create:

Specifies that the operating system should create a new file. If the file already exists, it will be overwritten ... FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate.