Strange (to me) behavior regarding DataContractSerializer built an instance of the class, not "returned" from the function

Sorry - this should have been sent for the 'ref' arguments. I relied on this problem and did not think. The answer is that the ModifiedSerialized function must accept the ref argument to directly change the "target".

ModifySerialized (ref Target DataClass) {...}

Given this runtime.serializable class:

[DataContract]
public class DataClass
{
        [DataMember(Order = 0)]
        public int Number
        {
            get;
            set;
        }

        [DataMember(Order = 1)]
        public string Name
        {
            get;
            set;
        }

        override public string ToString()
        {
            return "DataClass: " + Name + " --  " + Number;
        }
}

and some classes of exercises:

class Test
{
    public Test()
    {
        DataClass testDataClass = new DataClass() { Name = "Foo", Number = 123 };
        ModifySerialized(testDataClass);
        Console.WriteLine(testDataClass);
    }

    private void ModifySerialized(DataClass target)
    {
        MemoryStream stream = new MemoryStream();
        DataContractSerializer serializer = new DataContractSerializer(typeof(DataClass));
        serializer.WriteObject(stream, new DataClass() { Name = "serialized", Number = 777 });
        stream.Seek(0, SeekOrigin.Begin);
        string sDebug = ASCIIEncoding.ASCII.GetString(stream.GetBuffer());
        Console.WriteLine(sDebug);
        target = (DataClass)serializer.ReadObject(stream);
        Console.WriteLine(target);
    }
}

I expect console output from inside the test ctr, after the call there ModifySerialized(target)will be something like:

DataClass: name = serialized -- number = 777

But instead, the output after the call ModifySerialized(target)still shows

DataClass: name Foo number 123 (or similar)

-> (DataClass) The target does not change

ModifySerialized - , "target" (.. serialized, 777).

? , ? , ? , ModifySerialized(target) Number=1234, , .

...

+4
3

ModifySerialized target DataClass; , , testDataClass Test , . .

? , ? , ? , ModifySerialized (target) Number = 1234, , .

, :

, , ; , .

: , #

+3

, testDataClass , . , . :

private DataClass ModifySerialized(DataClass target)
{
    MemoryStream stream = new MemoryStream();
    DataContractSerializer serializer = new DataContractSerializer(typeof(DataClass));
    serializer.WriteObject(stream, new DataClass() { Name = "serialized", Number = 777 });
    stream.Seek(0, SeekOrigin.Begin);
    string sDebug = ASCIIEncoding.ASCII.GetString(stream.GetBuffer());
    Console.WriteLine(sDebug);
    target = (DataClass)serializer.ReadObject(stream);
    Console.WriteLine(target);
    return target; // here
}

public Test()
{
    DataClass testDataClass = new DataClass() { Name = "Foo", Number = 123 };
    testDataClass = ModifySerialized(testDataClass);
    Console.WriteLine(testDataClass);
}

ref.

private DataClass ModifySerialized(ref DataClass target)
{
    MemoryStream stream = new MemoryStream();
    DataContractSerializer serializer = new DataContractSerializer(typeof(DataClass));
    serializer.WriteObject(stream, new DataClass() { Name = "serialized", Number = 777 });
    stream.Seek(0, SeekOrigin.Begin);
    string sDebug = ASCIIEncoding.ASCII.GetString(stream.GetBuffer());
    Console.WriteLine(sDebug);
    target = (DataClass)serializer.ReadObject(stream);
    Console.WriteLine(target);
}

public Test()
{
    DataClass testDataClass = new DataClass() { Name = "Foo", Number = 123 };
    ModifySerialized(ref testDataClass);
    Console.WriteLine(testDataClass);
}
0

, serializer.ReadObject , . , target , , .

ModifySerialized(ref DataClass target). , " ". .

" " , , # 1, № 2 ..

0

Source: https://habr.com/ru/post/1523633/


All Articles