[.NET] DataTable en MSDN documentatie

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
:X

Waarom staat er in de MSDN en in de .NET documentatie dat een DataTable serializeable is

code:
1
2
3
[Serializable]
public class DataTable : MarshalByValueComponent, IListSource,
   ISupportInitialize, ISerializable
Note The DataSet and DataTable objects inherit from MarshalByValueComponent, and support the ISerializable interface for remoting. These are the only ADO.NET objects that can be remoted.
Ik heb bijgevolg een remoted object die een method heeft die een DataTable returned; echter, bij het testen van die method krijg ik een exception: the type blaat.melp in assembly x is not marked as serializable, terwijl dat type toch echt een DataTable is.
Zouden ze bij MS nu eens hun documentatie niet updaten, of ervoor zorgen dat die DataTAble daadwerkelijk serializable is. :X :X :/

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op woensdag 16 februari 2005 @ 12:24:
:X

Waarom staat er in de MSDN en in de .NET documentatie dat een DataTable serializeable is

code:
1
2
3
[Serializable]
public class DataTable : MarshalByValueComponent, IListSource,
   ISupportInitialize, ISerializable



[...]


Ik heb bijgevolg een remoted object die een method heeft die een DataTable returned; echter, bij het testen van die method krijg ik een exception: the type blaat.melp in assembly x is not marked as serializable, terwijl dat type toch echt een DataTable is.
Zouden ze bij MS nu eens hun documentatie niet updaten, of ervoor zorgen dat die DataTAble daadwerkelijk serializable is. :X :X :/
Ik heb hier ook wel eens problemen mee gehad inderdaad. Het bleek dat een DataSet wel gewoon Serializable is en omdat ik toen geen tijd had om er meer tijd aan te besteden heb ik toen gewoon mijn DataTable in een DataSet gedaan en die gebruikt. Ik vondt het toendertijd inderdaad ook erg vreemd

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
Side-note, mijn datatable is een 'strong typed' datatable.
Blijkbaar zijn die datatables niet serializable, maar 'gewone' data-tables wel.


Begrijpe wie kan.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
rwb schreef op woensdag 16 februari 2005 @ 12:27:
[...]

Ik heb hier ook wel eens problemen mee gehad inderdaad. Het bleek dat een DataSet wel gewoon Serializable is en omdat ik toen geen tijd had om er meer tijd aan te besteden heb ik toen gewoon mijn DataTable in een DataSet gedaan en die gebruikt. Ik vondt het toendertijd inderdaad ook erg vreemd
Ik kan het ook wel zo doen, maar het is ugly, en niet echt duidelijk voor de UI developers...

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op Wednesday 16 February 2005 @ 12:33:
[...]


Ik kan het ook wel zo doen, maar het is ugly, en niet echt duidelijk voor de UI developers...
Daar ben ik het inderdaad mee eens. Ik snap ook niet waarom het niet gewoon zo werkt zoals het in de documentatie staat. Maar daar heb jij nou natuurlijk ook niks aan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Hij is ook serializable, alleen als ie onderdeel uitmaakt van een dataset :P (die code zit nl allemaal in de dataset).

(hint: de datatable wordt niet geserialized door de soap/binary formatter, maar altijd als xml, en dat kan alleen de dataset verzorgen)

[ Voor 38% gewijzigd door EfBe op 16-02-2005 20:38 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Beetje oftopic... maar wat is serialisatie eigenlijk. Ik heb beetje zitten lezen op internet, maar ik kom niet verder dan dat het te maken heeft met instantiering van object en afsluiting...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
Verwijderd schreef op donderdag 17 februari 2005 @ 11:44:
Beetje oftopic... maar wat is serialisatie eigenlijk. Ik heb beetje zitten lezen op internet, maar ik kom niet verder dan dat het te maken heeft met instantiering van object en afsluiting...
Serializeren: geheugen -> persistent store
Deserializeren: persistent store -> geheugen.

In mijn geval heb ik serializatie nodig omdat mijn object over het netwerk moet verstuurd worden, over een IChannel, en voordat dit kan gebeuren moet het eerst geserialized worden. Eens het aan de overkant komt, moet het gedeserialized worden.

https://fgheysels.github.io/


Verwijderd

whoami schreef op donderdag 17 februari 2005 @ 11:47:
[...]


Serializeren: geheugen -> persistent store
Deserializeren: persistent store -> geheugen.

In mijn geval heb ik serializatie nodig omdat mijn object over het netwerk moet verstuurd worden, over een IChannel, en voordat dit kan gebeuren moet het eerst geserialized worden. Eens het aan de overkant komt, moet het gedeserialized worden.
Ahh interessant.. Kga zelf binnenkort ook beginnen met netwerk programmeren in .NET, maar heb er nog nooit wat mee gedaan...

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt in je typed datatable ISerializable opnieuw implementeren, alleen in C# (VB.NET kan dit niet aan, die kan geen interfaces expliciet implementeren). Ik weet niet hoe je je typed datatables genereert, maar wellicht via een template-engine, dus even je template aanpassen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/// <summary>
/// Protected constructor for deserialization.
/// Idea borrowed from Dino Esposito's article: http://msdn.microsoft.com/msdnmag/issues/02/12/CuttingEdge/default.aspx
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
protected MyTypedDataTable(SerializationInfo info, StreamingContext context)
{
    // Extract from the serialization info
    ArrayList colNames, colTypes, dataRows;

    colNames = (ArrayList)info.GetValue("ColNames", typeof(ArrayList));
    colTypes = (ArrayList)info.GetValue("ColTypes", typeof(ArrayList)); 
    dataRows = (ArrayList)info.GetValue("DataRows", typeof(ArrayList)); 

    // Add columns
    for(int i=0;i<colNames.Count; i++)
    {
        DataColumn col = new DataColumn(colNames[i].ToString(), Type.GetType(colTypes[i].ToString() ));     
        this.Columns.Add(col);
    }

    // Add rows
    for(int i=0; i<dataRows.Count; i++)
    {
        DataRow row = this.NewRow();
        row.ItemArray = (object[]) dataRows[i];
        this.Rows.Add(row);
    }

    base.TableName = info.GetString("_tableName");
}


/// <summary>
/// ISerializable member. Does custom serialization so members also get serialized (obeyWeakRelationships).
/// Serializes members of this class and uses the base class' implementation to serialize the rest.
/// Idea borrowed from Dino Esposito's article: http://msdn.microsoft.com/msdnmag/issues/02/12/CuttingEdge/default.aspx
/// </summary>
/// <param name="info"></param>
/// <param name="context"></param>
void System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Add arrays
    ArrayList colNames = new ArrayList();
    ArrayList colTypes = new ArrayList();
    ArrayList dataRows = new ArrayList();

    // Insert column information (names and types) into worker arrays
    foreach(DataColumn col in this.Columns)
    {
        colNames.Add(col.ColumnName); 
        colTypes.Add(col.DataType.FullName);   
    }

    // Insert rows information into a worker array
    foreach(DataRow row in this.Rows)
    {
        dataRows.Add(row.ItemArray);
    }

    // Add arrays to the serialization info structure
    info.AddValue("ColNames", colNames);
    info.AddValue("ColTypes", colTypes);
    info.AddValue("DataRows", dataRows);

    info.AddValue("_tableName", base.TableName);
}


(edit: heee.. nu is mn fancy color coding weg...:?]

[ Voor 15% gewijzigd door EfBe op 17-02-2005 12:51 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:32
Tja, ik zou idd die ISerializable kunnen implementeren, maar mijn DataTables worden door VS.NET gegenereerd...
Ik kan natuurlijk wel in het gegeneerde *.cs bestaand gaan pielen, maar als ik later iets verander aan die datatable (in de xsd), dan ben ik mijn code kwijt als VS.NET die dataset moet hergenereren.

https://fgheysels.github.io/

Pagina: 1