私はポータブルクラスライブラリ(Xamarin)で作成しているUWPアプリケーションを開発中です。ユーザーがXMLファイルに入力した情報(TextBoxなど)を保存する必要があります。シリアライズが長すぎます
ので、私はそれらのTextBoxから情報を取得PCLでクラスを作成しました:「継続」ボタンがあり、各ページの
namespace myProject
{
public class XMLData
{
[XmlRoot("MyRootElement")]
public class MyRootElement
{
[XmlAttribute("MyAttribute1")] //name of the xml element
public string MyAttribute1 //name of a textboxt e.g.
{
get;
set;
}
[XmlAttribute("MyAttribute2")]
public string MyAttribute2
{
get;
set;
}
[XmlElement("MyElement1")]
public string MyElement1
{
get;
set;
}
}
}
を。クリックすると、データが保存されます:最後のボタンで
async void Continue_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new Page2());
XMLData.MyRootElement mre = new XMLData.MyRootElement
{
MyAttribute1 = editor1.ToString(),
MyAttribute2 = editor2.ToString(),
MyElement1 = editor3.ToString()
};
}
をファイルをクリックして作成して保存する必要があります。
private void CreateandSave_Clicked(object sender, EventArgs e)
{
var s = DependencyService.Get<IFileHelper>().MakeFileStream();//using dependencyService to get a stream (there is no system.io.stream in PCL)
XMLData xmldat = new XMLData();
using (StreamWriter sw = new StreamWriter(s, Encoding.UTF8))
{
XmlSerializer serializer = new XmlSerializer(typeof(XMLData));
serializer.Serialize(sw, xmldat);
}
}
ここUWPクラスの私のコード(dependencyServiceのために私はと呼ばれるクラスを作成しましたストリームを取得し、保存場所+ファイルを作成するためのFileHelper)
namespace myProject.UWP
{
public class FileHelper: IFileHelper //IFileHelper is a simple interface I made with the Stream MakeFileStream(); method in it
{
public async Task<IRandomAccessStream> MakeFileStreamAsync()
{
StorageFolder sf = KnownFolders.DocumentsLibrary;
var file = await sf.CreateFileAsync("data.xml", CreationCollisionOption.OpenIfExists);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
return stream;
}
}
Stream IFileHelper.MakeFileStream()
{
var task = MakeFileStreamAsync();
task.Wait();
return task.Result.AsStreamForWrite();
}
}
}
問題は、私はCreateandSaveボタンに到達し、それをクリックすると、アプリがちょうどフリーズということです。エラーはありません。何も表示されません。私はデバッグを分解した後、私は望んでいるフォルダにXMLファイルが作成されているのを見ることができますが、空(0バイト)です。コードの何が間違っていますか?誰かアイデア?コードのこの部分で
をお楽しみください。したがって、2つのクラスの間でストリームを渡す必要はありません。これにより、デバッグが非常に簡単になります。 –
@Malte私はプログラミングには新しく、あなたの提案が私の理解を超えていると思います。私はあなたが何を意味しているのか、それをどのように実装するのかをよく理解していません。とにかくあなたの提案に感謝します、私はそれを感謝します! – RoloffM
MakeFileStreamの代わりにIFileHelperインターフェイスにメソッド "WriteStringToFileAsync(string s)"を追加し、このメソッドをすべてのプラットフォーム(Windows.Storage.FileIO.WriteTextAsyncのUWPなど)で実装し、データをXML文字列にシリアル化して実装を取得しますDependencyServiceからIFileHelperを取得し、その文字列をWriteStringToFileメソッドに渡します。 これは私が説明しようとしていたことを理解するのに役立ちます。 –