1

テストから取得した情報を使用して xml ドキュメントを作成しようとしています。基本的に私は{get; set:}情報を取得するために使用しています。プログラムを実行すると、ファイル情報が渡される場所が表示されますが、xml ドキュメントを作成できないというエラーが表示されるか、作成されていますが空白です。

コードは次のとおりです。

public class XmlCreate
    {
        public string Types { set; get; }
        public DateTime Time { get; set; }
        public bool done{ get; set; }


        public void SerializetoXml(IRepo repo)
        {       
            var filename = string.Format("{0}__{1}", DateTime.Now.ToString("yyyyMMdd"), "Log.xml");
            var path =
                @"C:\TestDocs\artifacts";
            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);
            var fullpath = Path.Combine(filename, path);
            var serializer = new XmlSerializer((typeof(IRepo))); 
            var textwriter = new StreamWriter(filename);
            serializer.Serialize(textwriter, repo);
            textwriter.Close();
        }
    }
4

2 に答える 2

2

XML シリアライザは、遭遇するすべてのオブジェクト タイプを事前に把握しておく必要があります。クラス型ではなくインターフェイスを使用してシリアライザーを作成しようとしている場合は、それが問題の一部である可能性があります。インターフェイスは、必ずしもオブジェクトのすべてのパブリック プロパティを公開するとは限りません。それ以外の場合は、XML シリアライザーがプロパティから自動的に推測できない型 (ポリモーフィズムなどにより) が含まれていることを確認する必要があります。ルート オブジェクトで XmlInclude 属性を使用して、これらの型についてシリアライザーに通知します。例:

// XmlInclude is necessary because our class doesn't explicitly mention derived object
[XmlInclude(typeof(ObjectDerived))]
class MyRootClass {
    public ObjectBase { get; set; }
}
class ObjectBase {
    // some properties here
}
class ObjectDerived : ObjectBase {
    // more properties here
}
...
var serializer = new XmlSerializer(typeof(MyRootClass));
于 2013-04-08T15:04:48.830 に答える
1

フルパスを次のように使用します

Path.Combine(path, filename) 

その逆ではありません。パス名が間違っていることが判明しました

編集:

Interface オブジェクトを渡してシリアル化することはできません。このリンク またはこれで提供されているように、コードを変更できます

于 2013-04-08T13:11:57.233 に答える