Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Deserializering av ett object som innehåller en DictionaryBase.

Postades av 2003-08-14 21:54:59 - Kristoffer Renholm, i forum asp.net generellt, Tråden har 0 Kommentarer och lästs av 680 personer

När jag försöker Deserialize website classen nedan får jag förljande felmeddelande.
<code>For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement.

Stack Trace:


[InvalidOperationException: For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement.]
System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType) +11541
System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns) +176
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns) +1584

[InvalidOperationException: There was an error reflecting property 'Nodes'.]
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns) +2340
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, Boolean repeats) +448

[InvalidOperationException: There was an error reflecting type 'Renholm.Lightweight.Business.Website'.]
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, Boolean repeats) +1070
System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace) +168
System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) +227
System.Xml.Serialization.XmlSerializer..ctor(Type type) +27
Renholm.Lightweight.Business.Website.Create(CultureInfo culture) in i:\renholm\lite\business\website.cs:41
Renholm.Lightweight.Business.User.get_Website() in I:\Renholm\Lite\Business\User.cs:19
Renholm.Lightweight.UI.Page.Page_Load(Object sender, EventArgs e) in i:\renholm\lite\ui\page.cs:20
System.EventHandler.Invoke(Object sender, EventArgs e) +0
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +731
</code>

När jag ändrar till att ha [XmlElement] i stället för [XmlArrayItem] får jag istället ett annat felmeddelande som lyder:
<code>
XML attributes may not be specified for the type Renholm.Lightweight.Business.NodeCollection.
</code>

Eftersom ett Dictionary object inte kan Serializeras som t.ex ett ICollection fick jag lov att göra en speciall lösning som jag tvivlar på blev rätt. Någon som har något tips/lösning?

Koden:
<code>
public class Website
{
private string title;
private NodeCollection nodes;

[XmlAttribute]
public string Title
{
get { return title; }
set { title = value; }
}

[XmlArrayItemAttribute("Node")]
public NodeCollection Nodes
{
get { return nodes; }
set { nodes = value; }
}

public static Website Create(CultureInfo culture)
{
string filepath = ConfigurationSettings.AppSettings["Settings"] + "\\" + culture.Name + "\\Site.xml";
Website result = (Website)HttpContext.Current.Cache["Site_" + culture.Name];

if (result == null)
{
using(StreamReader stream = new StreamReader(filepath))
{
XmlSerializer xml = new XmlSerializer(typeof(Website));
result = (Website)xml.Deserialize(stream);

HttpContext.Current.Cache.Insert("Site_" + culture.Name, result, new CacheDependency(filepath));
}
}

return result;
}

public Website()
{ }
}

public class NodeCollection : DictionaryBase, IXmlSerializable
{
public NodeCollection()
{ }

public virtual Node this[string key]
{
get { return (Node)Dictionary[key]; }
set { Dictionary[key] = value; }
}

public virtual void Add(string key, Node value)
{
Dictionary.Add(key, value);
}

public virtual bool Contains(string key)
{
return this.Dictionary.Contains(key);
}

public virtual bool ContainsKey(string key)
{
return this.Dictionary.Contains(key);
}

public virtual bool ContainsValue(Node value)
{
foreach (Node item in this.Dictionary.Values)
{
if (item == value)
return true;
} return false;
}

public virtual void Remove(string key)
{
this.Dictionary.Remove(key);
}

[XmlIgnore]
public virtual ICollection Keys
{
get { return this.Dictionary.Keys; }
}

[XmlIgnore]
public virtual ICollection Values
{
get { return this.Dictionary.Values; }
}

void IXmlSerializable.WriteXml(System.Xml.XmlWriter w)
{
XmlSerializer xml = new XmlSerializer(typeof(Node));
foreach (string key in Dictionary.Keys)
{
Node value = (Node)Dictionary[key];
xml.Serialize(w, value);
}
}

void IXmlSerializable.ReadXml(System.Xml.XmlReader r)
{
XmlSerializer xml = new XmlSerializer(typeof(Node));

r.Read();
r.ReadStartElement("Nodes");
while(r.NodeType != System.Xml.XmlNodeType.EndElement)
{
Node value = (Node)xml.Deserialize(r);
Dictionary.Add(value.Id, value);
r.MoveToContent();
}
r.ReadEndElement();
}

System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
}

public class Node
{
private string id;
private string name;
private NodeCollection nodes;
private ModuleCollection modules;

[XmlAttribute]
public string Id
{
get { return id; }
set { id = value; }
}

[XmlElement]
public string Name
{
get { return name; }
set { name = value; }
}

[XmlArrayItemAttribute("Node")]
public NodeCollection Nodes
{
get { return nodes; }
set { nodes = value; }
}

[XmlArrayItemAttribute("Node")]
public ModuleCollection Modules
{
get { return modules; }
set { modules = value; }
}

public Node()
{ }
}

public class ModuleCollection : CollectionBase
{
public void Add(Module item)
{
List.Add(item);
}

public void Remove(Module item)
{
List.Remove(item);
}

public Module this[int Index]
{
get { return (Module)List[Index]; }
set { List[Index] = value; }
}

public ModuleCollection()
{ }
}

public class Module
{
private string panel;
private string control;

[XmlElement]
public string Panel
{
get { return panel; }
set { panel = value; }
}

[XmlElement]
public string Control
{
get { return control; }
set { control = value; }
}

public Module()
{ }
}
</code>

XML filen
<code>
<?xml version="1.0" encoding="iso-8859-1" ?>
<Website Title="Test">
<Nodes>
<Node Id="start">
<Name>Startsidan</Name>
<Nodes>
<Node Id="undersida">
<Name>Start Undersidan</Name>
</Node>
</Nodes>
</Node>
</Nodes>
</Website>
</code>


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 155
27 952
271 704
7 968
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies