Har följande klasser i namespacet "Universum" som jag försöker serialisera ner till en xml-fil med XmlSerializer: Det hela beror på att XmlSerializer vill alltid i förväg kunna veta vilka typer som den skall deserialisera. I din property myPlanets så vet man inte vilken sorts objekt som finns i den, utan .NET antar att det är instanser av klassen Object i den. Tack för det snabba svaret! Nu fungerar det ska bara se över strukturen som bildas i xml-filen =).XmlSerializer ger fel....
<code>
public class SolarSystem
{
private ArrayList m_myPlanets;
private Star m_mySun;
private string m_myName;
public SolarSystem(Star sun,string n)
{
m_myPlanets = new ArrayList();
m_mySun = sun;
m_myName = n;
}
public SolarSystem()
{
}
public Star getSun()
{
return m_mySun;
}
public void addPlanet(Planet p)
{
m_myPlanets.Add(p);
}
public void deletePlanets()
{
m_myPlanets.Clear();
}
public string myName
{
set
{
m_myName = value;
}
get
{
return m_myName;
}
}
public ArrayList myPlanets
{
set
{
m_myPlanets = value;
}
get {
return m_myPlanets;
}
}
}
public class SpaceBody
{
private double m_myMass;
private double m_myRadius;
public SpaceBody(double mass, double radius)
{
m_myMass = mass;
m_myRadius = radius;
Console.WriteLine("public SpaceBody()");
}
public SpaceBody()
{
}
}
public class Planet
{
public class Planet: SpaceBody
{
private string m_myName;
private string m_myDescription;
private string m_myImageUrl;
public Planet(string name,string des,string img,double m,double r):base(m,r)
{
m_myName = name;
m_myDescription = des;
m_myImageUrl = img;
Console.WriteLine("Skapade en planet: " + m_myName);
}
public Planet()
{
}
public string getName()
{
return m_myName;
}
public string getDescription()
{
return m_myDescription;
}
public string getImageUrl()
{
return m_myImageUrl;
}
public string myName
{
set
{
m_myName = value;
}
get
{
return m_myName;
}
}
}
</code>
Skapar objekt av dessa klasser och använder mig av XmlSerialize för att få ner objekten som xml i "test.xml":
<code>
SolarSystem sols = new SolarSystem();
Planet p1 = new Planet("Jorden", "En fin planet med syre och shit", @"c:\asdf\", 42743, 42342);
sols.addPlanet(p1);
p1 = new Planet("Mars", "Röd", @"c:\asdf\asdf", 43222743, 42342);
sols.addPlanet(p1);
StreamWriter sw = new StreamWriter("test.xml");
XmlSerializer xs = new XmlSerializer(typeof(SolarSystem));
xs.Serialize(sw, sols);
sw.Close();
</code>
Får felet:
System.InvalidOperationException
Details: {"The type Universum.Planet was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."}
Är XmlInclude ett attribut som man ska sätta för de klasser som ska serialiseras?
Som ni märker är jag inte helt haj på detta område men om någon har orken att läsa igenom denna monster-post och kanske ge ett tips eller två så blir jag mycket lycklig.
/JonSv: XmlSerializer ger fel....
Du måste därför ange detta. Se http://www.dotnet247.com/247reference/msgs/38/193383.aspx för en som har samma problem och får en lösning.
Dessutom så tror jag att du här har samma problem med arvshierarkin SpaceBody - Planet (i alla fall skulle du ha det om du hade en property i SolarSystem av typen SpaceBody). Se http://www.topxml.com/xmlserializer/xmlincludeattribute.asp för en beskrivning av det. det går i stort sett ut på att du beskriver vilka nedärvda klasser som kan komma att påträffas när man desserialiserar ett objekt av denn klassen.
/AndreasSv:XmlSerializer ger fel....
/Jon