JSON писать не может быть сериализовано
Процесс:
Создать
Player
учебный класс.Создать игрока
List<Player>()
,Добавить игроков в список.
Напиши
json
серийный файл.Когда я нажимаю на
writeJson
Кнопка Я получаю сообщение об ошибке:"Type `'EditPlayers.Player'` cannot be serialized. Consider marking it with the `DataContractAttribute` attribute, and marking all of its members you want serialized with the `DataMemberAttribute` attribute. If the type is a collection, consider marking it with the `CollectionDataContractAttribute`.See the Microsoft .NET Framework documentation for other supported types."
Вопрос:
Как пометить List<Player>()
с CollectionDataContractAttribute
,
class Player
{
public int MemberId { get; set; }
public int Gender { get; set; }
public string LName { get; set; }
public string FName { get; set; }
public int Tee { get; set; }
public int Team { get; set; }
public int Flight { get; set; }
public int Ohc { get; set; }
public decimal HcIx { get; set; }
}
private async void writeJason_Click(object sender, RoutedEventArgs e)
{
try
{
await writeJsonAsync();
}
catch
{
}
}
private async void readJason_Click(object sender, RoutedEventArgs e)
{
await deserializerJsonAsync();
}
private List<Player> buildObjectGraph()
{
var players = new List<Player>();
players.Add(new Player() {MemberId=1, Gender=0, LName="Player", FName="New", Tee=1, Team=0, Flight=0, Ohc=0, HcIx=0M});
players.Add(new Player() {MemberId=2, Gender=0, LName="Draw", FName="Blind", Tee=1, Team=0, Flight=0, Ohc=0, HcIx=0M});
players.Add(new Player() {MemberId=3, Gender=0, LName="Moles", FName="Mike", Tee=1, Team=4, Flight=1, Ohc=2, HcIx=2.0M});
players.Add(new Player() {MemberId=4, Gender=0, LName="Broemeling", FName="Donald", Tee=1, Team=4, Flight=2, Ohc=10, HcIx=10.0M});
players.Add(new Player() {MemberId=5, Gender=0, LName="Nelson", FName="David", Tee=1, Team=4, Flight=3, Ohc=11, HcIx=11.7M});
players.Add(new Player() {MemberId=6, Gender=0, LName="Moles", FName="David", Tee=1, Team=4, Flight=4, Ohc=20, HcIx=20.0M});
players.Add(new Player() {MemberId=7, Gender=0, LName="Player", FName="A", Tee=1, Team=1, Flight=1, Ohc=0, HcIx=0M});
players.Add(new Player() {MemberId=8, Gender=0, LName="Player", FName="B", Tee=1, Team=1, Flight=2, Ohc=0, HcIx=0M});
players.Add(new Player() {MemberId=9, Gender=0, LName="Player", FName="C", Tee=1, Team=1, Flight=3, Ohc=0, HcIx=0M});
players.Add(new Player() {MemberId=10,Gender=0, LName="Player", FName="D", Tee=1, Team=1, Flight=4, Ohc=0, HcIx=0M});
return players;
}
private async Task writeJsonAsync()
{
var allPlayers = buildObjectGraph();
var serializer = new DataContractJsonSerializer(typeof(List<Player>));
//using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
// JSONFILENAME,
// CreationCollisionOption.ReplaceExisting))
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
JSONFILENAME, CreationCollisionOption.ReplaceExisting))
{
serializer.WriteObject(stream, allPlayers);
}
resultTextBlock.Text = "Write succeeded";
}
1 ответ
Вам не нужно отмечать List<Player>()
с CollectionDataContractAttribute
, Вместо этого вам нужно сделать Player
класс быть сериализуемым DataContractJsonSerializer
, как описано в документации: типы, поддерживаемые сериализатором контракта данных.
Самое простое решение - пометить Player
с Serializable
атрибут:
[Serializable]
class Player
{
// Remainder unchanged
}
В качестве альтернативы вы можете аннотировать его [DataContract]
а также [DataMember]
атрибуты:
[DataContract]
class Player
{
[DataMember]
public int MemberId { get; set; }
[DataMember]
public int Gender { get; set; }
[DataMember]
public string LName { get; set; }
[DataMember]
public string FName { get; set; }
[DataMember]
public int Tee { get; set; }
[DataMember]
public int Team { get; set; }
[DataMember]
public int Flight { get; set; }
[DataMember]
public int Ohc { get; set; }
[DataMember]
public decimal HcIx { get; set; }
}
В любом случае, ваш List<Player>
будет сериализуемым DataContractJsonSerializer
,
Обратите внимание, что сериализация контракта данных является обязательной, поэтому необходимо пометить каждое свойство или поле для сериализации с помощью [DataMember]
,