Avatar billede montago Praktikant
18. november 2007 - 22:06 Der er 9 kommentarer og
2 løsninger

Serialize af typer - bl.a. Color

Jeg prøver desperat at gemme og loade et objekt til en fil på disken.

jeg ønsker at bruge [Serializable] for at gøre det nemt for mig selv, men .NET brokker sig over ikke at kunne Serialize System.Windows.Media.Color


jeg vil benytte BinaryFormatter.

*nb jeg programmerer i .NET 3.0 WPF hvis det har relevans
Avatar billede anri Novice
18. november 2007 - 22:43 #1
Lidt googling bragte mig herhen :
http://www.codeproject.com/cs/miscctrl/MultiTabColorPicker.asp

Mon ikke der er lidt du kan bruge der?
Avatar billede montago Praktikant
19. november 2007 - 08:10 #2
ehm...

nu har jeg kun kigget meget kort på det projekt... det ser ikke ud til at der bliver brugt serialisering, load eller save...
Avatar billede anri Novice
19. november 2007 - 08:47 #3
Åh..  Sorry..  Jeg havde forstået at du blot skulle gennemløbe System.Windows.Media.Color og hente alle værdierne.
Avatar billede montago Praktikant
19. november 2007 - 09:11 #4
det oki.. :)

dét altid nice at nogen prøver...

Serialize betyder at objektet laves om til endten XML, SOAP eller Binær Representation som kan puttes i en fil eller loades
Avatar billede tjacob Juniormester
19. november 2007 - 10:54 #5
Hvis du ikke kommer videre med den formelle serialisering, så kunne du overveje at bruge:

Color.ToArgb og Color.FromArgb der laver colors om til en 32 bit Integer.

http://msdn2.microsoft.com/en-us/library/system.drawing.color.toargb.aspx
Avatar billede tjacob Juniormester
19. november 2007 - 11:00 #6
Ahh, jeg ser nu at det er en anden Color klasse du bruger.
Så kan du måske ikke bruge disse metoder alligevel....
Avatar billede montago Praktikant
19. november 2007 - 12:15 #7
spørgsmålet er om jeg kan bruge XML-Serializing princippet... hvor man ekskluderer en property under serializering og benytter en anden..

ligesom her : http://www.thescripts.com/forum/thread693476.html

jeg ved bare ikke hvordan man gør med BinaryFormatter...

System.Windows.Media.Color er en slags Enum af 100+ Colors med navne...

man må kunne konvertere den til integer...eller string...
Avatar billede nielle Nybegynder
19. november 2007 - 20:57 #8
> jeg programmerer i .NET 3.0 WPF hvis det har relevans

I allerhøjeste grad relevant :^)

Det er vigtigt at skelne mellem den Color der kommer fra Windows.Forms og den som kommer fra WPF; den du har fat på er af den den sidste type.

Man kan undre sig over at Microsoft har smækket en Serializable attribut på Windows.Forms versionen af Color og undladt det i WPF versionen af samme. Jeg kender desværre ikke grunden, men jeg synes at det flere steder virker som om at WPF ikke er heeelt færdig endnu...

WPF foretrækker nu at gemme den slags data som resourcer. Disse kan enten være indlejrende i applikationen (som regel via XAML), eller de kan være gemt eksternt i en fil. Den binære version af XAML hedder BAML, men jeg har desværre ikke lige kunne finde ud af hvordan man opretter og skriver til BAML-filer runtime.

Eksemplet fra dit link kunne laves nogenlunde som nedenstående med BinaryFormatter (BTW: hvorfor må det ikke være XML Formatter?). Jeg tvivler dog på at det skalere specielt godt til andre datatyper (med det gør linkets forslag vist heller ikke):

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows;
using System.Windows.Media;

namespace e806449
{
    public partial class App : System.Windows.Application
    {
        public App()
        {
            string fileName = @"C:\e806449.bin";

            // Serialisering

            MyClass myClass1 = new MyClass();
            myClass1.etTal = 42;
            myClass1.color = Color.FromScRgb(255F, 0F, 255F, 0F);
            myClass1.etAndetTal = 7 - 9 - 13;

            MessageBox.Show("Før: " + myClass1.color.ToString());

            Stream stream1 = File.OpenWrite(fileName);
            BinaryFormatter formatter1 = new BinaryFormatter();
            formatter1.Serialize(stream1, myClass1);
            stream1.Close();

            // Deserialisering

            Stream stream2 = File.OpenRead(fileName);
            BinaryFormatter formatter2 = new BinaryFormatter();
            MyClass myClass2 = (MyClass)formatter2.Deserialize(stream2);

            MessageBox.Show("Efter: " + myClass2.color.ToString());

            Environment.Exit(0);
        }
    }

    [Serializable]
    public class MyClass : IDeserializationCallback
    {
        public int etTal;

        [NonSerialized]
        private Color _color;

        public float colorScA;
        public float colorScR;
        public float colorScG;
        public float colorScB;

        public Color color
        {
            get { return _color; }
            set
            {
                Color tempColor = value;
                colorScA = tempColor.ScA;
                colorScR = tempColor.ScR;
                colorScG = tempColor.ScG;
                colorScB = tempColor.ScB;
                _color = tempColor;
            }
        }

        public int etAndetTal;

        #region IDeserializationCallback Members

        public void OnDeserialization(object sender)
        {
            color = Color.FromScRgb(colorScA, colorScR, colorScG, colorScB);
        }

        #endregion
    }
}
Avatar billede montago Praktikant
20. november 2007 - 10:55 #9
hey Nielle :)

jeg fik ideen, og lavede en alternativ løsning...
som dog nok gør det samme som din...

Send svar, så deler vi :)

Løsning...

        [NonSerialized]
        private Color Fill, Border;
        private string SLZ_Fill, SLZ_Border;

        [OnSerializing]
        void ConvertColors(StreamingContext sc)
        {
            SLZ_Border = Border.ScA + ";" + Border.ScR + ";" + Border.ScG + ";" + Border.ScB;
            SLZ_Fill = Fill.ScA + ";" + Fill.ScR + ";" + Fill.ScG + ";" + Fill.ScB;
        }
        [OnDeserialized]
        void ConvertToColors(StreamingContext sc)
        {
            Border = new Color();
            string[] Col = SLZ_Border.Split(';');
            Border.ScA = float.Parse(Col[0]);
            Border.ScR = float.Parse(Col[1]);
            Border.ScG = float.Parse(Col[2]);
            Border.ScB = float.Parse(Col[3]);

            Fill = new Color();
            Col = SLZ_Fill.Split(';');
            Fill.ScA = float.Parse(Col[0]);
            Fill.ScR = float.Parse(Col[1]);
            Fill.ScG = float.Parse(Col[2]);
            Fill.ScB = float.Parse(Col[3]);
        }
Avatar billede nielle Nybegynder
20. november 2007 - 10:56 #10
Svar :^)
Avatar billede nielle Nybegynder
20. november 2007 - 12:36 #11
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Netcompany A/S

Managing Architect

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Senior Platform Engineer

NOVAX A/S

QA Consultant

SOS International

Cisco Call Manager Specialist