그래서 휴대용 클래스 라이브러리 (Xamarin)에서 만드는 UWP 응용 프로그램에서 작업하고 있습니다. 사용자가 XML 파일에 입력 한 정보 (예 : 텍스트 상자)를 저장해야합니다. 각 페이지에서너무 오래 걸리는 직렬화
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;
}
}
}
는 "계속"버튼이 : 그 텍스트 상자에서 정보를 얻을 곳
그러므로 나는 PCL의 클래스를 만들었습니다. 파일을 클릭 마지막 단추에서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()
};
}
작성해야합니다 및 저장 : 클릭하면 데이터가 저장됩니다 dependencyService의 UWP 클래스 내 코드 (I 클래스를 만들어 여기에
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);
}
}
라고 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 바이트). 코드에 어떤 문제가 있습니까? 누구 아이디어? 이 코드 조각에서
왜 "WriteStringToFileAsync (문자열들)"와 같은 인터페이스에 메서드를 추가 한 다음 모든 플랫폼에서 구현하지 않는다 즐길 수 있습니다. 따라서 두 클래스 사이에서 스트림을 전달할 필요가 없습니다. 이렇게하면 디버그가 훨씬 쉬워집니다. –
@Malte 저는 프로그래밍에 익숙하지 않아, 당신의 제안이 제 이해를 초월 할 것이라고 생각합니다. 나는 당신이 의미하는 바를 이해하지 못하거나 그것을 구현할 방법을 이해하지 못합니다. 하지만 어쨌든 당신의 제안에 감사드립니다, 나는 그것을 감사드립니다! – RoloffM
MakeFileStream 대신 IFileHelper 인터페이스에 "WriteStringToFileAsync (string s)"메서드를 추가하고 모든 플랫폼에서이 메서드를 구현 한 다음 (예 : Windows.Storage.FileIO.WriteTextAsync의 UWP) 데이터를 XML 문자열로 serialize합니다. 구현을 얻습니다. DependencyService에서 IFileHelper를 제거하고 문자열을 WriteStringToFile 메서드에 전달합니다. 이것이 내가 설명하려고했던 것을 이해하는 데 도움이되기를 바랍니다. –