On Wed, May 11, 2016 at 5:09 AM, Denis Bakhvalov <[email protected]>
wrote:

> Hi,
>
> Suppose I have such message structure:
>
>
> package msg_RepAndOpt;
>
> message RepAndOpt{
>     repeated string name = 1;
>     optional string surname = 2;
>     ...
>     // there are lots of others.}
>
>
> And I have two components that have copies of this message:
>
>
> // component1:RepAndOpt A;
> A.add_name("Name");
> A.set_surname("Surname");
> // component2:RepAndOpt B;
>
>
> In my case components modify those messages via transaction mechanism. It
> means that if one component changes some field it also sends it to another
> component to propagate those changes. Component-receiver is doing merge:
>
>
> // Component2 modifies B and sends it to component1.// Component1 perfoms 
> merge:
> A.MergeFrom(B);
>
>
> Now, say, component2 wants to erase field "name". If it will send clear B
> message (default construction) than:
>
>    - - MergeFrom() will not modify A;
>    - - CopyFrom() will erase also other fields.
>
> Another way will be to fill B with the contents of A, clear name field and
> component1 will use CopyFrom(). But this is not acceptable because system
> is really high-loaded and there could be lots of other fields. So, desired
> solution to clean name field is:
>
>    1. 1. Component2 create B message.
>    2. 2. Explicitly stores information that it want to erase only name
>    field.
>    3. 3. Component1 perform A.MergeFrom(B).
>    4. 4. Result: A::name is cleared but other fields are left untouched.
>
> As far as I tested this applies to repeated and optional fields. Is there
> any ready-to-use solution or I should modify protobuf implementation?
>
I think you can do this using FieldMaskUtil:
https://github.com/google/protobuf/blob/beta-3/src/google/protobuf/util/field_mask_util.h#L111

You create an empty B message along with a FieldMask containing only the
field you want to clear, and use FieldMaskUtil::MergeMessageTo(A,
field_mask, &B)  to replace the field in A with the value from B.



> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to