2017-07-27 61 views
0

私はList(Of Player)の作成に使用するクラスPlayerを持っています。アプリケーションが終了したら保存する必要があります。 Windowsフォームではシリアル化するだけですが、UWPではこれ以上使用できないため、数十時間Googleに接続してからMicrosoft.Toolkit.Uwp、次にNewtonsoft.Jsonを見つけましたが、私は悲惨にそれらを使用しません。あなたの助けが必要です!VB.NETでList(Object of)をシリアライズするには?

のは、私は小さなクラスがあるとしましょう:

Dim Name As String 
Dim Score As Double 
Public Class Player 
    <JsonConstructor()> 
    Public Sub New(Name As String, Score As Double) ' New with score 
     Me.Name = Name 
     Me.Score = Math.Max(1, Score) 
    End Sub 
End Class 
Public Overrides Function ToString() As String ' ToString 
    Return $"{Name} [{Score}]" 
End Function 

どのように私は正常List(Of Player)を読み書きできますか?

' Loading MainPage.xaml 
Private Sub MainPage_Loading() Handles Me.Loading 
    ReadAsync() 
    MainFrame.Margin = New Thickness(0) 
    Window.Current.Content = MainFrame 
    MainFrame.Navigate(GetType(PlayerList), Players) 
End Sub 

' Read 
Private Async Sub ReadAsync() 
    Players = JsonConvert.DeserializeObject(Of List(Of Player))(Await FileIO.ReadTextAsync((Await StorageFolder.CreateFileAsync("players.json", CreationCollisionOption.OpenIfExists)))) 
    If Players Is Nothing Then 
     Players = New List(Of Player) 
     WriteAsync() 
    End If 
End Sub 

' Write 
Public Shared Async Sub WriteAsync() 
    Await FileIO.WriteTextAsync(Await StorageFolder.CreateFileAsync("players.json", CreationCollisionOption.ReplaceExisting), JsonConvert.SerializeObject(Players, Formatting.Indented)) 
End Sub 

' Loading PlayerList.xaml 
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs) 
    ListBoxPlayers.Items.Clear() 
    Players = e.Parameter 
    For Each Player In Players 
     ListBoxPlayers.Items.Add(Player) 
    Next 
End Sub 

' Adding a new player in the interface 
Private Sub ButtonAddPlayer_Click(sender As Button, e As RoutedEventArgs) Handles ButtonAddPlayer.Click 
    ' ... 
    ' Commit 
    MainPage.Players.Add(New Player(TextBoxName.Text)) 
    ListBoxPlayers.Items.Add(MainPage.Players(MainPage.Players.Count - 1)) 
    MainPage.WriteAsync() 
End Sub 

これはすべて混乱しています。プレーヤーのトラフを追加すると、通常のようにListBoxに入ります。しかし、アプリケーションを閉じてもう一度開くと、空のオブジェクトが一杯になります。

List of different players Serialization didn't work!

私は私の問題についての詳細を知るためにいくつかの怒りのテストをした、私は全くシリアライズないんだけど、私はおそらく正しくデシリアライズしてい判明。

Angry testing

+1

newtonsoft.json.netを使用してjsonにオブジェクトを直列化および逆シリアル化したり、その逆にしてみましたか? – Pratyay

+0

@Pratyayはい、私はやってみました。しかし、私は空のオブジェクトの数が正しくありません。 – NatoBoram

+0

投稿したコードは正しいです。私はあなたのコードでテストしましたが、うまくいきます。ただし、投稿したコードはまだ完成していません。まだ問題がある場合は、問題を再現できる[mcve]を共有してください。 –

答えて

0

私はそれを見つけ、それは私のクラスPlayer中ですが判明しました。

Dim Name As String 
Dim Score As Double 

働いていた何を::

Public Name As String 
Public Score As Double 

を私がやるべきこと:

Public Property Name As String 
Public Property Score As Double 

を私は時に "パブリック" として変数を設定しないように教えられた私が使用したもの

Javaでコーディングすると、私はPropertyがVisual Basicに存在することを知らなかった。

+0

これは実際にはVisual Basicの同じアドバイスです。 *そうしなければならない魅力的な理由がない限り、フィールドを公開しないでください。データメンバを公開する必要がある場合は(この場合はそうします)、プロパティを使用します。つまり、 'Public Property Name As String'を使用します。 –

関連する問題