Dziwne zachowanie serializacji

0

Mam w swoim projekcie taką oto klasę:

[Serializable]
    public class HighScore
    {
        public static readonly int quantity = 5;
        private string[] name = new string[quantity];
        private int[] score = new int[quantity];

        public HighScore()
        {
            for (int i = 0; i < quantity; i++)
            {
                name[i] = "brak";
                score[i] = 0;
            }

        }

        public HighScore(string[] nam, int[] sco)
        {
            System.Diagnostics.Debug.Assert(nam.Length != sco.Length
                || nam.Length != quantity, "Wrong quantity of high scores");
            name = nam;
            score = sco;
        }
......

reszta klasy to właściwości i metody.
W innej klasie mam taki kod:

HighScore highScore = new HighScore();
            highScore.AddToHighScore("michal", 300);
            highScore.AddToHighScore("kuba", 100);
            highScore.AddToHighScore("miszcz", 1000);
            Stream streamWrite = File.Create("highscore.hs");
            XmlSerializer ser = new XmlSerializer(typeof(HighScore));
            ser.Serialize(streamWrite, highScore);
            streamWrite.Close();

Serializacja nie wyrzuca żadnych wyjątków, kompilator nawet warningów nie zgłasza. powstaje taki oto plik:

<?xml version="1.0"?>
<HighScore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

i to tyle... żadnych danych. Czemu?
Dodam, że w tym samym assembly serializuje inną klasę i ta inna serializuje się bez najmniejszych problemów.

0

Serializacji podlegają wyłącznie pola i właściwości publiczne i niestatyczne. Masz takie?

0

Rzeczywiście, właściwości były publicznie get ale protected set. Dzięki za pomoc.

0

„You're doing it wrong”.

public class HighScore
{
  public string name;
  public int score;
  public HighScore(string aname,int ascore)
  {
    name=aname;
    score=ascore;
  }
}

...

var highscores=new List<HighScore>
  {
    new HighScore("Zenek",1000000),
    new HighScore("Józek",500),
    new HighScore("Franek",100)
  };
highscores.Add(new HighScore("Michał",900));
0

@Azarien - da się serializować bez publicznego bezparametrowego konstruktora? ;>

0
somekind napisał(a)

@Azarien - da się serializować bez publicznego bezparametrowego konstruktora? ;>

Nie wiem, nie pamiętam. Ale chodziło mi o pokazanie że sam kod był "nie w duchu C#".

0

tak, nie musi byc publiczny. protected/internal/private bedzie 100% w porzadku. on po prostu musi istniec, deserializer stanie na glowie zeby go przez reflection wydobyc i tak czy owak mu sie uda przy jakimkolwiec accesslevel

@non-public property:
vs 2005-2008

http://msdn.microsoft.com/en-us/library/182eeyhh(VS.71).aspx napisał(a)

•Only public properties and fields can be serialized. If you need to serialize non-public data, use the BinaryFormatter
class rather than XML serialization

zaś dla 2010:

http://msdn.microsoft.com/en-us/library/182eeyhh(v=VS.100).aspx</quote napisał(a)

•Only public properties and fields can be serialized. Properties must have public accessors (get and set methods). If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.</quote>
co sprowadza sie do max. kilku linijek ogolnego kodu

http://stackoverflow.com/questions/67959/net-xml-serialization

•Only public properties and fields can be serialized. Properties must have public accessors (get and set methods). If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.</quote>
co sprowadza sie do max. kilku linijek ogolnego kodu

http://stackoverflow.com/questions/67959/net-xml-serialization-gotchas

1 użytkowników online, w tym zalogowanych: 0, gości: 1