OVH Cloud OVH Cloud

ISerializable.GetObjectData public ?

11 réponses
Avatar
ShadowFil
Bonjour,

Une classe qui implémente ISerializable doit fournir une implémentation de
la méthode GetObjectData().

Cette méthode implémentée doit-elle être public ou protégée ?

Merci pour votre aide.

10 réponses

1 2
Avatar
Simon Mourier [MS]
Le mieux est de la coller à ISerializable:

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
...
}
}

voir ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
Simon.

"ShadowFil" a écrit dans le message de
news:
Bonjour,

Une classe qui implémente ISerializable doit fournir une implémentation de
la méthode GetObjectData().

Cette méthode implémentée doit-elle être public ou protégée ?

Merci pour votre aide.


Avatar
Paul Bacelar
Quel est l'intérêt d'implémenter une interface autrement que publiquement?
--
Paul Bacelar

"Simon Mourier [MS]" wrote in message
news:O#
Le mieux est de la coller à ISerializable:

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
...
}
}

voir ici:



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
Simon.

"ShadowFil" a écrit dans le message


de
news:
> Bonjour,
>
> Une classe qui implémente ISerializable doit fournir une implémentation


de
> la méthode GetObjectData().
>
> Cette méthode implémentée doit-elle être public ou protégée ?
>
> Merci pour votre aide.




Avatar
ShadowFil
Oui, effectivement !

Mais peut-être qu'une interface peut aussi servir à imposer uniquement à
toutes les classes dérivées d'une classe de base d'implémenter un mécanisme,
comme par exemple la sérialisation.

Car, je pense que la méthode GetObjectData() n'est jamais appelé par notre
code, mais seulement par le mécanisme de sérialisation de .NET qui passe
outre les attributs de visibilités.

"Paul Bacelar" a écrit :

Quel est l'intérêt d'implémenter une interface autrement que publiquement?
--
Paul Bacelar

"Simon Mourier [MS]" wrote in message
news:O#
> Le mieux est de la coller à ISerializable:
>
> [Serializable]
> public class MyClass: ISerializable
> {
> void ISerializable.GetObjectData(
> SerializationInfo info, StreamingContext context)
> {
> ...
> }
> }
>
> voir ici:
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
> Simon.
>
> "ShadowFil" a écrit dans le message
de
> news:
> > Bonjour,
> >
> > Une classe qui implémente ISerializable doit fournir une implémentation
de
> > la méthode GetObjectData().
> >
> > Cette méthode implémentée doit-elle être public ou protégée ?
> >
> > Merci pour votre aide.
>
>





Avatar
ShadowFil
Je ne comprends pas !
Le fait d'ajouter ISerializable impose une visibilité précise ? Laquelle ?

Parce que pour moi, la méthode que vous montrez dans votre exemple est
private, avec ou sans ISerializable collé.

"Simon Mourier [MS]" a écrit :

Le mieux est de la coller à ISerializable:

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
...
}
}

voir ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
Simon.

"ShadowFil" a écrit dans le message de
news:
> Bonjour,
>
> Une classe qui implémente ISerializable doit fournir une implémentation de
> la méthode GetObjectData().
>
> Cette méthode implémentée doit-elle être public ou protégée ?
>
> Merci pour votre aide.





Avatar
Simon Mourier [MS]
Ca permet de la cacher à l'intellisense par exemple.

Simon.
"Paul Bacelar" a écrit dans le message
de news:
Quel est l'intérêt d'implémenter une interface autrement que publiquement?
--
Paul Bacelar

"Simon Mourier [MS]" wrote in message
news:O#
Le mieux est de la coller à ISerializable:

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
...
}
}

voir ici:



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
Simon.

"ShadowFil" a écrit dans le message


de
news:
> Bonjour,
>
> Une classe qui implémente ISerializable doit fournir une implémentation


de
> la méthode GetObjectData().
>
> Cette méthode implémentée doit-elle être public ou protégée ?
>
> Merci pour votre aide.








Avatar
Simon Mourier [MS]
Je ne comprends pas votre question. L'implémentation d'une interface est
toujours accessible. On ne peut pas la protéger. C'est pour cela qu'il n'y a
pas de modifier sur la déclaration.

On peut toujours faire:

[Serializable]
public class MyClass: ISerializable
{
public void GetObjectData(SerializationInfo info, StreamingContext
context)
{
...
}
}

mais on ne peut pas faire

[Serializable]
public class MyClass: ISerializable
{
protected void GetObjectData(SerializationInfo info, StreamingContext
context)
{
...
}
}

le fait de déclarer

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
...
}
}

rend la méthode GetObjectData acessible uniquement par cast de MyClass en
ISerializable, mais elle est toujours publique.

Simon.

"ShadowFil" a écrit dans le message de
news:
Je ne comprends pas !
Le fait d'ajouter ISerializable impose une visibilité précise ? Laquelle ?

Parce que pour moi, la méthode que vous montrez dans votre exemple est
private, avec ou sans ISerializable collé.

"Simon Mourier [MS]" a écrit :

Le mieux est de la coller à ISerializable:

[Serializable]
public class MyClass: ISerializable
{
void ISerializable.GetObjectData(
SerializationInfo info, StreamingContext context)
{
...
}
}

voir ici:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeserializationiserializableclassgetobjectdatatopic.asp
Simon.

"ShadowFil" a écrit dans le message
de
news:
> Bonjour,
>
> Une classe qui implémente ISerializable doit fournir une implémentation
> de
> la méthode GetObjectData().
>
> Cette méthode implémentée doit-elle être public ou protégée ?
>
> Merci pour votre aide.







Avatar
ShadowFil
Merci. Je ne connaissais pas cette déclaration explicite pour
l'implémentation de méthodes d'interface.

Quand vous dites qu'une interface est toujours accessible, qu'on ne peut pas
la protéger, cela veut que même si la classe et déclarée protected, private,
internal, tout le monde pourra quand même accéder aux méthodes d'interfaces
qu'elle implémente ?
Avatar
ShadowFil
Qu'est-ce qui permet de cacher quoi à l'intellisense ?
Avatar
Simon Mourier [MS]
Quand on utilise Visual Studio, la petite fenêtre d'aide ne propose pas
GetObjectData, ce qui est normal
Simon.

"ShadowFil" a écrit dans le message de
news:
Qu'est-ce qui permet de cacher quoi à l'intellisense ?




Avatar
Simon Mourier [MS]
Si je récupère une référence sur l'instance de cette classe, oui. C'est le
principe même de l'interface: il y a un contrat public (si l'interface est
publique), je l'implémente et je déclare l'implémenter, donc forcément, on
peut l'utiliser.
Simon.

"ShadowFil" a écrit dans le message de
news:
Merci. Je ne connaissais pas cette déclaration explicite pour
l'implémentation de méthodes d'interface.

Quand vous dites qu'une interface est toujours accessible, qu'on ne peut
pas
la protéger, cela veut que même si la classe et déclarée protected,
private,
internal, tout le monde pourra quand même accéder aux méthodes
d'interfaces
qu'elle implémente ?


1 2