Laden...

Remoting - Problem mit eingenen Objekten

Erstellt von Grimmbizkit vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.057 Views
G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 11 Jahren
Remoting - Problem mit eingenen Objekten

Hallo zusammen,

ich habe eine Problem mit dem senden von eigenen Objekten beim Remoting.

Ich habe einen Remoting Channel mit Full.

Start des Server:


public static RemoteObject StartServer()
        {
            BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();
            serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            BinaryClientFormatterSinkProvider clientSinkProvider = new BinaryClientFormatterSinkProvider();

            System.Collections.IDictionary TcpChannelProps = new System.Collections.Hashtable();

            TcpChannelProps["name"]="CoreIPC";
            TcpChannelProps["port"]="34502";

            chanSrv = new TcpChannel(TcpChannelProps, clientSinkProvider, serverSinkProvider);//, null, null);
            
            if (ChannelServices.GetChannel(chanSrv.ChannelName) == null)
                ChannelServices.RegisterChannel(chanSrv, false);

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemotingServer_IPC", WellKnownObjectMode.SingleCall);
            
            RemoteObject remObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "tcp://localhost:34502/RemotingServer_IPC");
            if (remObject == null)
                throw new Exceptions.NullReferenceRemotingException();
            else
                return (remObject);
        }

Dieses Objekt:


[Serializable]
public class PictureObject
{
public enum PictureState { Unknown, TakePicture, SendPicture, PictureCreated, PictureFailed };

private Int64 nSize;
private System.Drawing.Image oPicture;
private PictureState oState;
private Guid oId;

public Int64 Size
{
get { return nSize; }
set { nSize = value; }
}
public System.Drawing.Image Picture
{
   get { return oPicture; }
   set { oPicture = value; }
}
public PictureState State
{
   get { return oState; }
   set { oState = value; }
}
public Guid PictureID
{
   get { return oId; }
   set { oId = value; }
}

public PictureObject(PictureState State)
{
   oState = State;
}

public PictureObject()
{
}

Aber wenn ich dann z.B. das Image auslesen will steht dort beim Debugger nur System.Runtime.Remoting.Proxies.__TransparentProxy drin.

Bei GUID oder State sind richtige Werte dirn.

Weiß jemand wieso ich keine Images/Bitmaps übertragen kann?

106 Beiträge seit 2011
vor 11 Jahren

Hallo Grimmbizkit,

Aber wenn ich dann z.B. das Image auslesen will steht dort beim Debugger nur System.Runtime.Remoting.Proxies.__TransparentProxy drin.

Das ist meiner Ansicht nach auch richtig, oPicture ist der einzige Referenztyp in deiner Klasse, der Rest der Eigenschaften sind Wertetypen.
Referenztypen werden als TransparentProxy(beim Remoting) dargestellt, es sollte aber dennoch die Klasse Image reprästentieren.
Du schweigst dich leider aus, was daran falsch ist. Kannst du nicht mit dem TransparentProxy arbeiten als wäre es ein Image?

MfG
Rabban

Ps: deine Benennungen und Schreibweise sind suboptimal, die würde ich mir an deiner Stelle noch mal durch den Kopf gehen lassen.

G
Grimmbizkit Themenstarter:in
310 Beiträge seit 2006
vor 11 Jahren

Hallo Rabban,

das ist richtig, allerdings kann ich den TransparentProxy nicht einer PictureBox zuweisen. Wie kann ich sowas denn wieder in ein Image-Object umwandeln??

Was meinst du mit deine Benennungen und Schreibweise sind suboptimal, was könnte man denn verbessern?

106 Beiträge seit 2011
vor 11 Jahren

Wie kann ich sowas denn wieder in ein Image-Object umwandeln?

Ich habe leider nicht genug Erfahrung mit Remoting um dir das zu beantworten, aber ich benutze für sowas immer Streams. Übertrag das Bild einfach als Stream und erstelle daraus wieder ein Image.

Arg OT, aber er hat gefragt^^

Was meinst du mit deine Benennungen und Schreibweise sind suboptimal, was könnte man denn verbessern?

Das hängt natürlich immer von den eigenen CodeConventions ab. Deswegen kann ich dir diesbezüglich auch nur Empfehlungen geben.


System.Collections.IDictionary TcpChannelProps = new System.Collections.Hashtable();

Lokale variablen werden immer klein im CamelCase geschrieben.


[Serializable]
public class PictureObject
{
    ...
}

Wenn ich das richtig verstanden habe, dann benutzt du diese Klasse nur um die Daten zu übertragen, das geht aber aus dem KlassenNamen nicht annähernd hervor.
"ImageRemoteMessage" oder etwas in der Art wäre viel sprechender. Dann weisst du auch noch in ein paar Monaten was du mit dieser Klasse gemeint hast, ohne das ganze Projekt studieren zu müssen.


private Int64 nSize;
private System.Drawing.Image oPicture;

nSize? oPicture? Der sinn hinter "o" und "n" erschliesst sich mir nicht wirklich. Zumal du auch das "o" bei einem Enum benutzt.
Wenn du private Member hast, die durch öffentliche Eigenschaften gedeckelt sein sollen, dann sollte der Member genauso wie die Eigenschaft geschrieben werden. Hierbei gibt es mehrere Vorgehensweisen, ich sehe sehr oft das viele einen "_" (Unterstrich) vor den Namen setzen, finde das aber sehr unschön und wenn ich mich richtig entsinne, dann sagt auch MS in seinen CodeConvention-Empfehlungen, Keine unterstriche zu benutzen.
Ich benutzte bei sowas immer den PropertyNamen nur klein geschrieben.


public PictureState State
 {
    get { return oState; }
    set { oState = value; }
 }

Welchen Sinn hat das? Warum schreibst du nicht einfach:


public PictureState State {get; set;}

macht genau das gleiche, nur das du auf eine private variable verzichten kannst.
Deine schreibweise macht nur sinn wenn du vor dem setzen von State noch irgendetwas machen willst. Dies trifft aber (zumindest in deinem geposteten Beispiel) nicht zu.


public PictureObject(PictureState State)
{
    oState = State;
}

Hier setzt du direkt die private variable, anstatt den öffentlichen Getter und Setter zu nutzen, so wie du ihn implementiert hast.

Richtig wäre es:


public PictureObject(PictureState State)
{
    this.State = State;
}


public PictureObject(PictureState State)
{
    oState = State;
}

Fast übersehen, Parameternamen schreibt man immer klein, das sind sowas wie lokale variablen.


public enum PictureState { Unknown, TakePicture, SendPicture, PictureCreated, PictureFailed };

Das ist eine äusserst unschöne schreibweise, ich weiß nun nicht ob du das so zusammengeschoben hast damit es hier im Thread nicht so viel Platz wegnimmt oder ob das deine schreibweise ist.
Aber aussehen sollte es in etwa so:


public enum PictureState 
{ 
    Unknown, 
    TakePicture, 
    SendPicture, 
    PictureCreated, 
    PictureFailed,
}

Nur so kann man die einzelnen States auch wirklich Kommentieren(und das solltest du).

Und zum schluss noch eine persönliche Empfehlung. Ich würde Eigenschaften immer nach dem bennenen was sie sind. z.B.


public PictureState State
 {
    get { return oState; }
    set { oState = value; }
 }

würde zu:


public PictureState PictureState
 {
    get { return oState; }
    set { oState = value; }
 }

werden.

Das löst zwar nicht dein eigentliches Problem, aber vllt bringt es dich ja in deiner Entwicklung etwas weiter.

MfG
Rabban