Please see my comment to the question.
Data contract cannot be passed as a parameters. Data contract is the conceptual structure expressed as a combination of some set of related data types and some data contract attributes over those types and members; more exactly, this is some invariant
of that set of types: when you change it but the types and the members marked as the part of contract remains the same and keep their structural relationships, the contract remains the same despite of the change in the type set. This way, this can be the invariant of some product's life time, or even some data standard.
As you can see, this is all pure metadata, which is pretty hard to express as data (but possible). This is not what you pass "as a parameter".
Serialization based on data contract takes any object graph
created with the contract (in general case, not even necessarily a tree, any arbitrary graph) and comprehensively serialize it into any stream. Later on, this stream can be deserialized back to the object graph, a memory structure logically identically to the original object graph.
Using Data Contracts:
Therefore, each time, each instance of the data is represented either as a data graph, or a stream content; and these representations are mutually reversible and comprehensive. And yes, the reference to a stream or to a graph can be passed anywhere where a reference remains valid, so there is no such problem.
If you have some related problems, feel free to ask your follow-up questions.