C # XML-объект сериализации объекта Array «Произошла ошибка при создании документа XML». - PullRequest
0 голосов
/ 23 марта 2012

У меня проблема с системой сериализации c # XML, она выдает исключение Ambigus,

Произошла ошибка при создании документа XML.

Теперь яесть класс, который содержит ссылки на другие классы и массивы других классов

EG

namespace P2PFileLayout
{
    public class p2pfile
    {
        public FileList FileList;
        public StatusServer StatusServer;
        public String Hash;
    }
}
namespace P2PFileLayout.parts
{
    public class StatusServer
    {
        public Auth Auth;
        public Servers Servers;
    }
    public class Servers
    {
        public Server[] Server;
    }
    public class Server
    {
        public bool AuthRequired = false;
        public string Address;
    }
    public class Files
    {
        public File[] File;
    }
    public class File
    {
        public string FileName = "";
        public int BlockSize = 0;
        public int BlockCount = 0;
    }
    public class Directory
    {
        public string Name;
        public Files Files;
        public Directory[] Dir;
    }
    public class Auth
    {
        public AuthServer[] AuthServer;
    }
    public class FileList
    {
        public Files Files;
        public Directory[] Directory;
    }
}

Данные моего примера

        // create the test file
        testFile = new p2pfile();

        // create a fake fileList
        testFile.FileList = new P2PFileLayout.parts.FileList();
        testFile.FileList.Directory = new P2PFileLayout.parts.Directory[1];
        testFile.FileList.Directory[0] = new P2PFileLayout.parts.Directory();
        testFile.FileList.Directory[0].Name = "testFolder";
        testFile.FileList.Directory[0].Files = new P2PFileLayout.parts.Files();
        testFile.FileList.Directory[0].Files.File = new P2PFileLayout.parts.File[2];
        testFile.FileList.Directory[0].Files.File[0] = new P2PFileLayout.parts.File();
        testFile.FileList.Directory[0].Files.File[0].FileName = "test.txt";
        testFile.FileList.Directory[0].Files.File[0].BlockSize = 64;
        testFile.FileList.Directory[0].Files.File[0].BlockCount = 1;
        testFile.FileList.Directory[0].Files.File[1] = new P2PFileLayout.parts.File();
        testFile.FileList.Directory[0].Files.File[1].FileName = "test2.txt";
        testFile.FileList.Directory[0].Files.File[1].BlockSize = 64;
        testFile.FileList.Directory[0].Files.File[1].BlockCount = 1;

        // create a fake status server
        testFile.StatusServer = new P2PFileLayout.parts.StatusServer();
        testFile.StatusServer.Servers = new P2PFileLayout.parts.Servers();
        testFile.StatusServer.Servers.Server = new P2PFileLayout.parts.Server[1];
        testFile.StatusServer.Servers.Server[0] = new P2PFileLayout.parts.Server();
        testFile.StatusServer.Servers.Server[0].Address = "http://localhost:8088/list.php";

        // create a file hash (real)
        HashGenerator.P2PHash hashGen = new HashGenerator.P2PHash();
        testFile.Hash = hashGen.getHash();

        treeView1.Nodes.Add(new TreeNode("Loading..."));

        Classes.CreateTreeView ctv = new Classes.CreateTreeView();
        ctv.BuildTreeView(testFile.FileList, treeView1);
        treeView1.AfterCheck += new TreeViewEventHandler(treeView1_AfterCheck);

Теперь это не так сложно, какмой с точки зрения dept, как мои объекты цикла i, так что dir поддерживает больше dirs, но это всего лишь пример

Затем я сериализую в строку var, так как я хочу сделать немного больше, чем просто сериализовать ее, новот моя сериализация

private string ToXml(object Obj, System.Type ObjType)
        {
            // instansiate the xml serializer object
            XmlSerializer ser = new XmlSerializer(ObjType);
            // create a memory stream for XMLTextWriter to use
            MemoryStream memStream = new MemoryStream();
            // create an XML writer using our memory stream
            XmlTextWriter xmlWriter = new XmlTextWriter(memStream, Encoding.UTF8);
            // write the object though the XML serializer method using the W3C namespaces
            ser.Serialize(xmlWriter, Obj);
            // close the XMLWriter
            xmlWriter.Close();
            // close the memoryStream
            memStream.Close();
            // get the string from the memory Stream
            string xml = Encoding.UTF8.GetString(memStream.GetBuffer());
            // remove the stuff before the xml code we care about
            xml = xml.Substring(xml.IndexOf(Convert.ToChar(60)));
            // clear any thing at the end of the elements we care about
            xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1));
            // return the XML string
            return xml;
        }

Может кто-нибудь увидеть, почему это не работает или какие-либо подсказки, почему это не будет работать нормально

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Почему вы делаете это вручную? Как насчет этого подхода? http://support.microsoft.com/kb/815813

Test test = new Test() { Test1 = "1", Test2 = "3" };
System.Xml.Serialization.XmlSerializer x = new   System.Xml.Serialization.XmlSerializer(test.GetType());
MemoryStream ms = new MemoryStream();
x.Serialize(ms, test);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
string xml = sr.ReadToEnd();
0 голосов
/ 14 ноября 2013

Что касается неоднозначного сообщения, взгляните на внутренние исключения.Ошибки сериализации XML часто используют исключение без исключения, и вам, как правило, приходится обращаться ко всем уровням исключений InnerException, чтобы узнать, что на самом деле происходит.

...