Mijn muziek: Spotify
The ships hung in the sky in much the same way that bricks don’t.
Sowieso classes die resources managen, of ze dat nou stateful doen of niet. Je hebt er natuurlijk niets aan om een filestream of een socket oid te serializen.Veel classes hebben geen state en is het dus ook onzinnig om ze te serializen
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
if all you have is a hammer, everything looks like a nail
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
En ik kan me voorstellen dat een drag-&-drop class ook niet zinnig te serializen is; die drag&drop operatie is al lang afgelopen als je het object weer deserialized.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
que?:MSalters schreef op donderdag 04 augustus 2011 @ 16:16:
Een top-level object serializable maken lijkt me ook wat overkill.
1
2
3
4
| [SerializableAttribute] [ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] [ComVisibleAttribute(true)] public class Object |
Edit: En ja, je kan practisch alles casten naar object, serializen, deserializen en het originele type is er dan nog
[ Voor 15% gewijzigd door Xiphalon op 04-08-2011 16:38 ]
Ja, maar waarom zou je het doen? Een object ComVisible maken is toch niet het zelfde als het serializable maken? Of bedoelde je dat niet?darkmage schreef op donderdag 04 augustus 2011 @ 16:37:
[...]
que?:
C#:
1 2 3 4 [SerializableAttribute] [ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] [ComVisibleAttribute(true)] public class Object
Edit: En ja, je kan practisch alles casten naar object, serializen, deserializen en het originele type is er dan nog
Komt erbij dat het vaak niet wordt afgetest.
Want ik zie wel eens klassen die de Serializable interface implementeren maar die toch niet serializeerbaar zijn.
(Klassen die een inputstream/outputstream bevatten bijvoorbeeld)
Ook moet je je communicatie kanaliseren: je moet nadenken en weten wat naar buiten mag en wat niet.
Zomaar alles serializeerbaar maken is op dat vlak ook al een risico. Zeker als iemand later even snel, snel iets nodig heeft en ziet ... wauw ik kan deze top klasse doorsturen en daar staat hetgeen in wat ik wil.
Kom je er op een bepaald moment achter dat een klasse serializeerbaar moet zijn: geen probleem.
Dan pas je de klasse gewoon aan (je ontwikkelt dus alleen wat op dat moment echt nodig is), natuurlijk sta je er wel even bij stil of het wel goed is om deze klasse serializeerbaar te maken.
Iets langer: Dingen die je niet direct nodig hebt kun je beter niet doen. Een serialize() maken voor elke class die je bouwt kost gewoon tijd, en als je het niet direct nodig hebt (bijvoorbeeld als je het opslaan van een objectstructuur aan het implementeren bent), moet je het ook niet maken 'om het maar te hebben'.
Altijd?Het komt altijd van pas
Future proofing heet dat, met een gedachte van 'Ja maar, misschien hebben we het ooit nog eens nodig' of 'Ja maar over drie weken ga ik mijn objecten op schijf opslaan en dan heb ik het nodig'. Als je het niet gelijk nodig hebt, niet doen.[...]en vaak komt het voor dat je er later pas achter komt dat de klasse serializable had moeten zijn.
(het future proofing kan ook subtieler zijn overigens. Wie heeft bijvoorbeeld niet eens een (tweede / derde) constructor geschreven omdat het wel handig zou kunnen zijn?)
Slechte quote. Een top level app object is een object wat je applicatie als geheel representeert. Het "document" deel ervan is waarschijnlijk wel serializeerbaar, maar je input state is dat typisch niet.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Verwijderd
Onzin, hoe serialize jij een DB connectie of socket dan bijvoorbeeld? (Zie de andere voorbeelden in dit topic)Verwijderd schreef op vrijdag 26 augustus 2011 @ 01:41:
je kunt alles ook serializen
[ Voor 11% gewijzigd door RobIII op 26-08-2011 08:15 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Verwijderd
Je kunt deze objecten serializen, of ze dan nog bruikbaar zijn na het deserializen is de vraag. Het is een feit dat je ieder object, een sequentie van bytes, gewoon kan opslaan. Zoals ik al zei, kijk maar naar Eloquera of db4o.RobIII schreef op vrijdag 26 augustus 2011 @ 08:14:
[...]
Onzin, hoe serialize jij een DB connectie of socket dan bijvoorbeeld? (Zie de andere voorbeelden in dit topic)
[ Voor 5% gewijzigd door Verwijderd op 26-08-2011 09:18 ]
Of 't dan überhaupt zinnig is ze te serializen is dan de werkelijke vraagVerwijderd schreef op vrijdag 26 augustus 2011 @ 09:16:
of ze dan nog bruikbaar zijn na het deserializen is de vraag.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
1. Dingen doen zonder zeker te weten dat het bruikbaar is...Verwijderd schreef op vrijdag 26 augustus 2011 @ 09:16:
[...]
Je kunt deze objecten serializen, of ze dan nog bruikbaar zijn na het deserializen is de vraag.
2. Als de staat niet te serializen is, is het object dus niet triviaal te serializen.
{signature}
Kan je een subclass serializen (serializable maken) als de base class niet serializable is ?MSalters schreef op donderdag 04 augustus 2011 @ 16:16:
Een top-level app object serializable maken lijkt me ook wat overkill.
https://fgheysels.github.io/
Verwijderd
Jawhoami schreef op vrijdag 26 augustus 2011 @ 10:51:
[...]
Kan je een subclass serializen (serializable maken) als de base class niet serializable is ?
Verwijderd
De (lokale) staat is _altijd_ te serializen. Zo simpel is het. Ik wil alleen zeggen dan SerializableAttribute alleen sugar is om aan te geven dat het wellicht nuttig kan zijn om een bepaald object van dat type te serializen. Ik weet niet wat je met "triviaal" bedoelt, maar voor mij is een deel van het geheugen persisteren triviaal (dus ieder object).Voutloos schreef op vrijdag 26 augustus 2011 @ 10:47:
[...]
1. Dingen doen zonder zeker te weten dat het bruikbaar is...
2. Als de staat niet te serializen is, is het object dus niet triviaal te serializen.
En het is dan ook geen syntactic sugar of enkel syntax. Er is zeker wel een semantische waarde: Er wordt bewust de eigenschap aangehangen dat het te serializen is.
{signature}
Maar je gaat hier voorbij aan het feit dat een object niet enkel in het geheugen opgeslagen data is. Persoonlijk ben ik van mening dat je een resource identifier niet kunt serializeren omdat niet de data, maar de resource hetgeen is dat voor dat object van belang is. Door enkel de referentie op te slaan heb je niet ineens de resource (database/ssh/ftp verbinding of file handle oid) ook weer terug bij het deserializeren.Verwijderd schreef op vrijdag 26 augustus 2011 @ 11:10:
[...]
De (lokale) staat is _altijd_ te serializen. Zo simpel is het. Ik wil alleen zeggen dan SerializableAttribute alleen sugar is om aan te geven dat het wellicht nuttig kan zijn om een bepaald object van dat type te serializen. Ik weet niet wat je met "triviaal" bedoelt, maar voor mij is een deel van het geheugen persisteren triviaal (dus ieder object).
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Verwijderd
Dat heb ik ook niet gezegd.Janoz schreef op vrijdag 26 augustus 2011 @ 13:18:
[...]
Maar je gaat hier voorbij aan het feit dat een object niet enkel in het geheugen opgeslagen data is. Persoonlijk ben ik van mening dat je een resource identifier niet kunt serializeren omdat niet de data, maar de resource hetgeen is dat voor dat object van belang is. Door enkel de referentie op te slaan heb je niet ineens de resource (database/ssh/ftp verbinding of file handle oid) ook weer terug bij het deserializeren.
Dan is het dus niet zinnig om alles te serializen. Net waar het hele topic over gaat. Punt.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Neen, dat is niet mogelijk.
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
| public class Base
{
private readonly int _a;
public Base( int a )
{
_a = a;
}
public virtual void WriteMe()
{
Console.WriteLine ("_a = " + _a);
}
}
[Serializable]
public class Derived : Base
{
private readonly string _b;
public Derived( string b, int a )
: base (a)
{
_b = b;
}
public override void WriteMe()
{
base.WriteMe ();
Console.WriteLine ("_b = " + _b);
}
}
static void Main( string[] args )
{
var d = new Derived ("serializetest", 17);
d.WriteMe ();
using( var fs = new FileStream (@"c:\tmp\test.zzz", FileMode.Create) )
{
var f = new BinaryFormatter ();
f.Serialize (fs, d);
}
using( var fs = new FileStream (@"c:\tmp\test.zzz", FileMode.Open) )
{
var f = new BinaryFormatter ();
var result = (Derived)f.Deserialize (fs);
result.WriteMe ();
}
Console.ReadLine ();
} |
Resulteert in een [c]SerializationException[/c] bij het serializeren:
Vandaar natuurlijk dat de Object class serializable is.{"Type 'SerializeTest.Program+Base' in Assembly 'SerializeTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable."}
Dikke zever. Het SerializableAttribute is helemaal geen syntactical sugar. Het is de snelste manier om ervoor te zorgen dat je een object makkelijk kunt serializen/deserializen.Verwijderd schreef op vrijdag 26 augustus 2011 @ 01:41:
SerializableAttribute is gewoon syntactische sugar, je kunt alles ook serializen (kijk naar db4o / eloquera). Het geeft aan dat je de intentie hebt om een bepaald type te serializen.
Zelfs als je zelf wilt bepalen hoe de serializatie moet gebeuren, en je dus de ISerializable interface gaat gaan implementeren, heb je dat Serializable attribuut dus nog nodig.
[ Voor 16% gewijzigd door whoami op 26-08-2011 14:51 ]
https://fgheysels.github.io/
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Verwijderd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| class Program
{
static void Main(string[] args)
{
var container = Db4oFactory.OpenFile("store");
container.Store(new A() {Prop1 = "Test", Prop2 = 6});
container.Commit();
container.Close();
container = Db4oFactory.OpenFile("store");
var obj = container.Query<A>(a => a.Prop1 == "Test");
Console.Write(obj.Prop2); //6
}
}
class A
{
public string Prop1 { get; set; }
[NonSerialized]
public int Prop2 { get; set; }
} |
Dit geldt volgens wikipedia als seralization.
En nu met een resourceVerwijderd schreef op vrijdag 26 augustus 2011 @ 15:53:
Vooruit dan:
...
Dit geldt volgens wikipedia als seralization.
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Inderdaad, vandaar ook mijn retorische vraag van een tijdje geleden, eerder in dit topic.Janoz schreef op vrijdag 26 augustus 2011 @ 15:30:
Dat is ook niet vreemd. Wanneer de superclass niet aangeeft dat hij serializable is, dan kun je nooit een valide state van de superclass garanderen voor de subclass wanneer je die deserializeert.
https://fgheysels.github.io/
Tja, dit gaat over serializeren in een externe store, zoals eender welke DB, maar dat was volgens mij niet de insteek van de topicstarter.Verwijderd schreef op vrijdag 26 augustus 2011 @ 15:53:
Vooruit dan:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23class Program { static void Main(string[] args) { var container = Db4oFactory.OpenFile("store"); container.Store(new A() {Prop1 = "Test", Prop2 = 6}); container.Commit(); container.Close(); container = Db4oFactory.OpenFile("store"); var obj = container.Query<A>(a => a.Prop1 == "Test"); Console.Write(obj.Prop2); //6 } } class A { public string Prop1 { get; set; } [NonSerialized] public int Prop2 { get; set; } }
Dit geldt volgens wikipedia als seralization.
https://fgheysels.github.io/
Als je "lokale staat" definieert als louter dat stukje geheugen in het object, dan wel ja. Maar dan klopt je definitie gewoonweg niet, simple as that.Verwijderd schreef op vrijdag 26 augustus 2011 @ 11:10:
[...]
De (lokale) staat is _altijd_ te serializen.
En who cares wat er daar in het geheugen staat, dat is waar je als gebruiker van dat object totaal niet in geïnteresseerd bent. Het gaat erom wat dat object representeert, en het is die representatie die je wilt serializen (daar heb je het ook over als je het hebt over het serialiseren van objecten).
[ Voor 33% gewijzigd door .oisyn op 26-08-2011 20:49 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.